MFC 訊息對映的實現

2021-05-28 02:23:08 字數 2080 閱讀 2153

訊息對映的實現

windows訊息概述

windows應用程式的輸入由windows系統以訊息的形式傳送給應用程式的視窗。這些視窗通過視窗過程來接收和處理訊息,然後把控制返還給windows。

訊息的分類

佇列訊息和非佇列訊息

從訊息的傳送途徑上看,訊息分兩種:佇列訊息和非佇列訊息。佇列訊息送到系統訊息佇列,然後到執行緒訊息佇列;非佇列訊息直接送給目的視窗過程。

這裡,對訊息佇列闡述如下:

windows維護乙個系統訊息佇列(system message queue),每個gui執行緒有乙個執行緒訊息佇列(thread message queue)。

滑鼠、鍵盤事件由滑鼠或鍵盤驅動程式轉換成輸入訊息並把訊息放進系統訊息佇列,例如wm_mousemove、wm_lbuttonup、 wm_keydown、wm_char等等。windows每次從系統訊息佇列移走乙個訊息,確定它是送給哪個視窗的和這個視窗是由哪個執行緒建立的,然 後,把它放進視窗建立執行緒的執行緒訊息佇列。執行緒訊息佇列接收送給該執行緒所建立視窗的訊息。執行緒從訊息佇列取出訊息,通過windows把它送給適當的視窗 過程來處理。

除了鍵盤、滑鼠訊息以外,佇列訊息還有wm_paint、wm_timer和wm_quit。

這些佇列訊息以外的絕大多數訊息是非佇列訊息。

系統訊息和應用程式訊息

系統訊息id的範圍是從0到wm_user-1,或0x80000到0xbffff;應用程式訊息從wm_user(0x0400)到 0x7fff,或0xc000到0xffff;wm_user到0x7fff範圍的訊息由應用程式自己使用;0xc000到0xffff範圍的訊息用來和 其他應用程式通訊,為了id的唯一性,使用::registerwindowmessage來得到該範圍的訊息id。

但是在當前例子中,當前物件的類ctview沒有覆蓋該函式,所以cwnd的windowproc被呼叫。

這個函式把下一步的工作交給onwndmsg函式來處理。如果onwndmsg沒有處理,則交給defwindowproc來處理。

onwndmsg和defwindowproc都是cwnd類的虛函式。

onwndmsg的原型如下:

bool cwnd::onwndmsg( uint message,

wparam wparam, lparam lparam,result*presult );

該函式是虛函式。

和windowproc一樣,由於當前物件的類ctview沒有覆蓋該函式,所以cwnd的onwndmsg被呼叫。

在cwnd中,mfc使用onwndmsg來分別處理各類訊息:

如果是wm_command訊息,交給oncommand處理;然後返回。

如果是wm_notify訊息,交給onnotify處理;然後返回。

如果是wm_activate訊息,先交給_afxhandleactivate處理(後面5.3.3.7節會解釋它的處理),再繼續下面的處理。

如果是wm_setcursor訊息,先交給_afxhandlesetcursor處理;然後返回。

如果是其他的windows訊息(包括wm_activate),則

首先在訊息緩衝池進行訊息匹配,

若匹配成功,則呼叫相應的訊息處理函式;

若不成功,則在訊息目標的訊息對映陣列中進行查詢匹配,看它是否處理當前訊息。這裡,訊息目標即ctview物件。

如果訊息目標處理了該訊息,則會匹配到訊息處理函式,呼叫它進行處理;

否則,該訊息沒有被應用程式處理,onwndmsg返回false。

關於windows訊息和訊息處理函式的匹配,見下一節。

預設處理函式defwindowproc將在討論對話方塊等的實現時具體分析。

windows訊息的查詢和匹配

cwnd或者派生類的物件呼叫onwndmsg搜尋本物件或者基類的訊息對映陣列,尋找當前訊息的訊息處理函式。如果當前物件或者基類處理了當前訊息,則必定在其中乙個類的訊息對映陣列中匹配到當前訊息的處理函式。

訊息匹配是乙個比較耗時的任務,為了提高效率,mfc設計了乙個訊息緩衝池,把要處理的訊息和匹配到的訊息對映條目(條目包含了訊息處理函式的地 址)以及進行訊息處理的當前類等資訊構成一條緩衝資訊,放到緩衝池中。如果以後又有同樣的訊息需要同乙個類處理,則直接從緩衝池查詢到對應的訊息對映條目 就可以了。

MFC訊息對映

run這個函式來建立和處理訊息迴圈 bool afxapi afxinternalpumpmessage return true 顯而易見,mfc中處理訊息也是利用了win32下的訊息處理 那麼還是這樣的結構 typedef struct tagmsg msg 有了這個概念之後我們知道,mfc通過訊...

從MFC訊息對映巨集分析MFC訊息對映的實現

在mfc中,我們可以找到如下三個巨集 declare massage map begine massage map class,bassclass end massage map 下面來分析這三個巨集 1 declare message map 作用 為乙個訊息響應類宣告必需的成員變數和成員函式。d...

MFC訊息對映機制

一 mfc中採用的這種訊息處理機制成為 mfc訊息對映機制 乙個mfc訊息響應函式在程式中有三處相關資訊 函式原型,函式實現,關聯訊息和訊息響應函式的巨集。函式原型 標頭檔案cdrawview 兩個afx msg注釋巨集之間 訊息響應函式原型的宣告 afx msg void onlbuttondow...