以下のように見え、どのようにクラスがCPaintManagerUIメッセージ配信の権利を行っていCWindowWnd。
MessageLoop機能CPaintManagerUIクラスで1ルック:
- 空CPaintManagerUI :: MessageLoop()
- {
- MSGのMSG = {0}。
- しばらく(::のGetMessage(&MSG、NULL、0、0)){//メッセージを取得します。
- (!CPaintManagerUI :: TranslateMessage(&MSG)){//メッセージフィルタリングの場合
- :: TranslateMessage(&MSG)。
- :: DispatchMessageを(&MSG);. //関数呼び出し__WndProc又は__ControlProc機能CWindowWndクラスであるウィンドウメッセージ処理ウィンドウに分配。
- }
- }
- }
最初のメッセージは、メッセージCPaintManagerUI TranslateMessageクラスによって受信されます。
2.コールCWindowWnd ::次の操作を実行するためにウィンドウを作成するために作成します。
1)ウィンドウにサブ制御クラス(すなわち、代わりにアナログ制御duilibシステム制御である)場合は、機能__ControlProcメッセージコールバック関数として設定されています。
2)ウィンドウクラスを登録し、サブクラス化しません。このとき、ウィンドウ設定__WndProcコールバックメッセージ処理。
3)のCreateWindowEx API関数を持つウィンドウを作成します。
ここでは、関連するサブクラスを見ていない、私が作成プロセスを見て、標準のウィンドウを理解しています。この操作は、__WndProc後にニュースに配布されます
3. __WndProcは、関数の定義を見てみましょう。
- LRESULT CALLBACK CWindowWnd :: __のWndProc(HWND hWndを、UINT uMsg、WPARAM wParamに、LPARAM lParamに)
- {
- CWindowWnd * pThis = NULL;
- ウィンドウクラスにバインドするためにこのメッセージに// {(uMsg == WM_NCCREATE)場合
- LPCREATESTRUCTのたLPC = reinterpret_castは<LPCREATESTRUCT>(lParamに)のCreateWindowEx関数から//最後のパラメータ(すなわちCWindowWndオブジェクトポインタ)
- pThis = static_castを<CWindowWnd *>(lpcs-> lpCreateParams)。
- pThis-> m_hWndを=のhWnd;
- :: SetWindowLongPtr(hWndは、GWLP_USERDATA、reinterpret_castは<LPARAM>(pThis)); //ユーザデータがウィンドウに提供します
- }
- 他の{
- pThis = reinterpret_castは<CWindowWnd *>(:: GetWindowLongPtr(hWndは、GWLP_USERDATA))。
- もし(uMsg == WM_NCDESTROY && pThis!= NULL){
- LRESULTのLRES = :: CallWindowProc(pThis-> m_OldWndProc、hWndを、uMsg、wParamに、lParamに); //最後に受信したメッセージは、仕事を終え実行するために、ウィンドウに処理することができます。
- :: SetWindowLongPtr(pThis-> m_hWndを、GWLP_USERDATA、0L); //オブジェクトとウィンドウクラス間の結合関係を取り消します
- もし(pThis-> m_bSubclassed)pThis-> Unsubclass();
- pThis-> m_hWndを= NULL;
- pThis-> OnFinalMessage(hWndを);
- LRESを返します。
- }
- }
- もし(pThis!= NULL){
- 返すpThis->のhandleMessage(uMsg、wParamに、lParamに); //この呼び出しメッセージハンドラクラスの継承
- }
- 他の{
- 返す::は、DefWindowProc(hWndを、uMsg、wParamに、lParamに); //バインドされていないクラスオブジェクト、それはデフォルトのウィンドウメッセージ処理関数を呼び出します
- }
- }
__WndProcによって受信される第2のメッセージは、その後、機能HandlerMessage CWindowWndクラスを広げます。
CWindowWndのような3。外観はHandlerMessage仮想関数のためのクラスの実装を継承しました。
- LRESULT CMainWnd ::のhandleMessage(UINT uMsg、WPARAM wParamに、LPARAM lParamに)
- {
- LRESULTのLRES = 0;メッセージ処理の//戻り値。
- BOOL bHandled = TRUE; //メッセージを伝承するために継続するかどうか。
- スイッチ(uMsg)
- {
- ケースのWM_CREATE:LRES = OnInitResource(bHandled);破る; //ロードなどのXML解析として最も重要な仕事を初期化します。
- デフォルト:
- = FALSE bHandled。
- }
- もし(bHandled)
- {
- LRESを返します。
- }
- (m_pm.MessageHandler(uMsg、wParamに、lParamに、LRES))場合CPaintManagerUIは:: MessageHandlerの特定の機能は、処理を制御通過//
- {
- LRESを返します。
- }
- 返すCWindowWnd ::のhandleMessage(uMsg、wParamに、lParamに); //デフォルトのメッセージハンドラはそれのようCWindowWnd呼び出す扱われません。
- }
これは、ユーザーが特定の処理を押すメッセージである。CPaintManagerUIは、関数にMessageHandlerのクラスオブジェクトを通過した。未処理のメッセージがCWindowWndを処理するために、デフォルトのメッセージ・ハンドラ・クラスに返されます。
TranslateMessage 4. CPaintManagerUIクラス、コンテンツMessageHandlerの機能。
- BOOL CPaintManagerUI :: TranslateMessage(定数LPMSG pMsgを)
- {
- HWND hwndParent = :: GetParent関数(pMsg-> HWND); //親ウィンドウメッセージ受信ウィンドウを取得します。
- UINT uStyle = GetWindowStyle(pMsg-> HWND); //取得ウィンドウのスタイル
- LRESULT LRES = 0。
- 以下のために(INT i = 0; iはm_aPreMessages.GetSize()<; I ++のを){//これはCPaintManagerUI m_aPreMessageクラスオブジェクトを保持しています。
- CPaintManagerUI *のpT = static_castを<CPaintManagerUI *>(m_aPreMessages [I])。
- もし(pMsg-> HWND == PT-> GetPaintWindow()//メッセージがバウンド現在のウィンドウCPaintManagerUIに属している場合
- ||(hwndParent == PT-> GetPaintWindow()&&((uStyle&WS_CHILD)!= 0)))//メッセージは、現在のウィンドウ内のメッセージウィンドウで、(例えば、ActiveXコントロール)
- {
- (PT-> PreMessageHandler(pMsg->メッセージ、pMsg-> wParamに、pMsg-> lParamに、LRES))場合にはTRUEを返す; //この場合はPreMessageHandlerフィルタ関数と呼ばれています。
- }
- }
- FALSEを返します。
- }
そのような結合CPaintManagerUI :: initで変数ウィンドウに追加m_aPreMessage静的メンバ変数、。
5. CPaintManagerUI :: PreMessageHandlerメッセージフィルタリング機能。
- BOOL CPaintManagerUI :: PreMessageHandler(UINT uMsg、WPARAM wParamに、LPARAM lParamに、LRESULT&/ * LRES * /)
- {
- //ループ電流メッセージフィルタリスト。M_aPreMessageFilter要素はIMessageFilterUIはMessageHandlerの唯一の仮想関数のインタフェースです。
- //クラス変数は、ユーザーがm_aPreMessageFiltersリストにこのインタフェースを追加することができます継承された。(AddMessageFilterコール機能が達成するために)
- 以下のために(int型私= 0;私はm_aPreMessageFilters.GetSizeを()<;私は++)
- {
- BOOL bHandled = FALSE;
- LRESULT LRESULT = static_castを<IMessageFilterUI *>(m_aPreMessageFilters [I]) - > MessageHandlerの(uMsg、wParamに、lParamに、bHandled)。
- IF(bHandled){
- TRUEを返します。
- }
- }
- //以下は、いくつかの重要なメッセージフィルタリングされています。
- // WM_KEYDOWN VK_TABキーがコントロールにフォーカスを移動するかどうかを確認してください。
- // WM_SYSCHARは、wParamの文字の加速制御キーマッチを取得し、それを活性化させます。
- //(TEventUIをシミュレートするために)コントロールイベントを生成しWM_SYSKEYDOWN
- }
5. CPaintManagerUI :: MessageHandlerの機能。
1)界面IMessageFilterUIのm_aMessageFiltersリストを横断し、MessageHandlerの関数呼び出し、関連するメッセージが再度フィルタリング(上記m_aPreMessageFiltersと同様)
このプロセスウィンドウでWM_PAINTメッセージ2)は、コントロールのすべての外観の状態を表示します。
3)マウスイベント、実装制御活性化と関連するイベントを処理します。
4)処理WM_TIMERメッセージ、使用CPaintManagerUIのSetTimerのすべてのコントロールは、KillTimerは、タイマー機能などの機能を実現します。
5)処理CPaintManagerUIカスタムメッセージクラス、WM_APP + 1および+2、
WM_APP + 1は、遅延制御対象の破壊を制御するために使用されます
破壊プロセス非同期メッセージ2 WM_APP +。
(CPaintManagerUI :: SendNotify制御機能を有する非同期メッセージは、メッセージ・オブジェクトはm_aAsyncNotifyリストを追加するために、その後のPostMessage関数WM_APP + 2)
5)その他の基本的なプロセス・ウィンドウに関連するメッセージを。
CPaintManagerUI内部DUILIBイベントがTEventUI送達を形成する構造のようなイベント機能CControlUI呼び出されます。