/*! @brief コントロールプロセスを初期化する MutexCPを作成・ロックする。 CControlTrayを作成する。 @author aroka @date 2002/01/07 @date 2002/02/17 YAZAKI 共有メモリを初期化するのはCProcessに移動。 @date 2006/04/10 ryoji 初期化完了イベントの処理を追加、異常時の後始末はデストラクタに任せる @date 2013.03.20 novice コントロールプロセスのカレントディレクトリをシステムディレクトリに変更 */ bool CControlProcess::InitializeProcess() { MY_RUNNINGTIMER( cRunningTimer, "CControlProcess::InitializeProcess" ); // アプリケーション実行検出用(インストーラで使用) m_hMutex = ::CreateMutex( NULL, FALSE, GSTR_MUTEX_SAKURA ); if( NULL == m_hMutex ){ ErrorBeep(); TopErrorMessage( NULL, _T("CreateMutex()失敗。\n終了します。") ); return false; } std::tstring strProfileName = to_tchar(CCommandLine::getInstance()->GetProfileName()); // 初期化完了イベントを作成する std::tstring strInitEvent = GSTR_EVENT_SAKURA_CP_INITIALIZED; strInitEvent += strProfileName; m_hEventCPInitialized = ::CreateEvent( NULL, TRUE, FALSE, strInitEvent.c_str() ); if( NULL == m_hEventCPInitialized ) { ErrorBeep(); TopErrorMessage( NULL, _T("CreateEvent()失敗。\n終了します。") ); return false; } /* コントロールプロセスの目印 */ std::tstring strCtrlProcEvent = GSTR_MUTEX_SAKURA_CP; strCtrlProcEvent += strProfileName; m_hMutexCP = ::CreateMutex( NULL, TRUE, strCtrlProcEvent.c_str() ); if( NULL == m_hMutexCP ){ ErrorBeep(); TopErrorMessage( NULL, _T("CreateMutex()失敗。\n終了します。") ); return false; } if( ERROR_ALREADY_EXISTS == ::GetLastError() ){ return false; } /* 共有メモリを初期化 */ if( !CProcess::InitializeProcess() ){ return false; } // コントロールプロセスのカレントディレクトリをシステムディレクトリに変更 TCHAR szDir[_MAX_PATH]; ::GetSystemDirectory( szDir, _countof(szDir) ); ::SetCurrentDirectory( szDir ); /* 共有データのロード */ // 2007.05.19 ryoji 「設定を保存して終了する」オプション処理(sakuext連携用)を追加 if( !CShareData_IO::LoadShareData() || CCommandLine::getInstance()->IsWriteQuit() ){ /* レジストリ項目 作成 */ CShareData_IO::SaveShareData(); if( CCommandLine::getInstance()->IsWriteQuit() ){ return false; } } /* 言語を選択する */ CSelectLang::ChangeLang( GetDllShareData().m_Common.m_sWindow.m_szLanguageDll ); RefreshString(); MY_TRACETIME( cRunningTimer, "Before new CControlTray" ); /* タスクトレイにアイコン作成 */ m_pcTray = new CControlTray; MY_TRACETIME( cRunningTimer, "After new CControlTray" ); HWND hwnd = m_pcTray->Create( GetProcessInstance() ); if( !hwnd ){ ErrorBeep(); TopErrorMessage( NULL, LS(STR_ERR_CTRLMTX3) ); return false; } SetMainWindow(hwnd); GetDllShareData().m_sHandles.m_hwndTray = hwnd; // 初期化完了イベントをシグナル状態にする if( !::SetEvent( m_hEventCPInitialized ) ){ ErrorBeep(); TopErrorMessage( NULL, LS(STR_ERR_CTRLMTX4) ); return false; } return true; }
/*! 現在の折り返し文字数に合わせて全データのレイアウト情報を再生成します @date 2004.04.03 Moca TABが使われると折り返し位置がずれるのを防ぐため, nPosXがインデントを含む幅を保持するように変更.m_nMaxLineKetasは 固定値となったが,既存コードの置き換えは避けて最初に値を代入するようにした. */ void CLayoutMgr::_DoLayout(bool bBlockingHook) { MY_RUNNINGTIMER( cRunningTimer, "CLayoutMgr::_DoLayout" ); /* 表示上のX位置 2004.03.28 Moca nPosXはインデント幅を含むように変更(TAB位置調整のため) */ int nAllLineNum; if( GetListenerCount() != 0 ){ NotifyProgress(0); /* 処理中のユーザー操作を可能にする */ if( bBlockingHook ){ if( !::BlockingHook( NULL ) )return; } } _Empty(); Init(); // Nov. 16, 2002 genta // 折り返し幅 <= TAB幅のとき無限ループするのを避けるため, // TABが折り返し幅以上の時はTAB=4としてしまう // 折り返し幅の最小値=10なのでこの値は問題ない if( GetTabSpace() >= GetMaxLineKetas() ){ m_nTabSpace = CKetaXInt(4); } nAllLineNum = m_pcDocLineMgr->GetLineCount(); SLayoutWork _sWork; SLayoutWork* pWork = &_sWork; pWork->pcDocLine = m_pcDocLineMgr->GetDocLineTop(); // 2002/2/10 aroka CDocLineMgr変更 pWork->pLayout = NULL; pWork->pcColorStrategy = NULL; pWork->colorPrev = COLORIDX_DEFAULT; pWork->nCurLine = CLogicInt(0); while( NULL != pWork->pcDocLine ){ pWork->cLineStr = pWork->pcDocLine->GetStringRefWithEOL(); pWork->eKinsokuType = KINSOKU_TYPE_NONE; //@@@ 2002.04.20 MIK pWork->nBgn = CLogicInt(0); pWork->nPos = CLogicInt(0); pWork->nWordBgn = CLogicInt(0); pWork->nWordLen = CLogicInt(0); pWork->nPosX = CLayoutInt(0); // 表示上のX位置 pWork->nIndent = CLayoutInt(0); // インデント幅 _MakeOneLine(pWork, &CLayoutMgr::_OnLine1); if( pWork->nPos - pWork->nBgn > 0 ){ // 2002/03/13 novice AddLineBottom( pWork->_CreateLayout(this) ); pWork->colorPrev = pWork->pcColorStrategy->GetStrategyColorSafe(); pWork->exInfoPrev.SetColorInfo(pWork->pcColorStrategy->GetStrategyColorInfoSafe()); } // 次の行へ pWork->nCurLine++; pWork->pcDocLine = pWork->pcDocLine->GetNextLine(); // 処理中のユーザー操作を可能にする if( GetListenerCount()!=0 && 0 < nAllLineNum && 0 == ( pWork->nCurLine % 1024 ) ){ NotifyProgress(::MulDiv( pWork->nCurLine, 100 , nAllLineNum ) ); if( bBlockingHook ){ if( !::BlockingHook( NULL ) )return; } } // 2002/03/13 novice } // 2011.12.31 Botの色分け情報は最後に設定 m_nLineTypeBot = pWork->pcColorStrategy->GetStrategyColorSafe(); m_cLayoutExInfoBot.SetColorInfo(pWork->pcColorStrategy->GetStrategyColorInfoSafe()); m_nPrevReferLine = CLayoutInt(0); m_pLayoutPrevRefer = NULL; if( GetListenerCount()!=0 ){ NotifyProgress(0); /* 処理中のユーザー操作を可能にする */ if( bBlockingHook ){ if( !::BlockingHook( NULL ) )return; } } }