MFC訊息對映

2021-06-28 00:36:04 字數 2703 閱讀 8375

run這個函式來建立和處理訊息迴圈

bool afxapi afxinternalpumpmessage()

return true;

}

顯而易見,mfc中處理訊息也是利用了win32下的訊息處理

那麼還是這樣的結構:

typedef struct tagmsg  msg;
有了這個概念之後我們知道,mfc通過訊息對映機制來派發或處理各種訊息,關於訊息對映,我去偷張過來:

沒有高畫質無碼大圖,只能湊合著看了,關於上圖可以這樣理解:

子視窗在處理訊息時需要用fun1與是在自己的表中找到了,可是要用fun100的時候,就找不到了,然後通過parenttable到父類中msghandles找,找不到了,那就呼叫

defwindowproc預設處理了。

而mfc在實現這一過程中,需要去構建這個表,我們經常看到這樣的**,剛開始只是知道這個由vs自動生成,可是並不知道為什麼

begin_message_map(cexampledlg, cdialogex)

on_wm_syscommand()

on_wm_paint()

on_wm_querydragicon()

end_message_map()

我們來詳細講講這個地方:

轉到定義:

#define begin_message_map(theclass, baseclass) \

ptm_warning_disable \

const afx_msgmap* theclass::getmessagemap() const \

\const afx_msgmap* pascal theclass::getthismessagemap() \

\}; \

static const afx_msgmap messagemap = \

; \return &messagemap; \

} \

ptm_warning_restore

上面**實質上新增了_messageentries和messagemap(這是構建訊息對映的關鍵)

afx_msgmap_entry _messageentries

這是乙個afx_msgmap_entry 型別的陣列變數,是乙個靜態成員變數,用來容納類的訊息對映條目。乙個訊息對映條目可以用afx_msgmap_entry結構來描述。

afx_msgmap_entry結構的定義如下:

struct afx_msgmap_entry

;

從上述結構可以看出,每條對映有兩部分的內容:第一部分是關於訊息id的,包括前四個域;第二部分是關於訊息對應的執行函式,包括後兩個域。

在上述結構的六個域中,pfn是乙個指向ccmdtarger成員函式的指標。函式指標的型別定義如下:

typedef void (afx_msg_call ccmdtarget::*afx_pmsg)(void);

當使用一條或者多條訊息對映條目初始化訊息對映陣列時,各種不同型別的訊息函式都被轉換成這樣的型別:不接收引數,也不返回引數的型別。因為所有可以有訊息對映的類都是從ccmdtarge派生的,所以可以實現這樣的轉換。

nsig是乙個標識變數,用來標識不同原型的訊息處理函式,每乙個不同原型的訊息處理函式對應乙個不同的nsig。在訊息分發時,mfc內部根據nsig把訊息派發給對應的成員函式處理,實際上,就是根據nsig的值把pfn還原成相應型別的訊息處理函式並執行它。

第二個成員變數的宣告

afx_msgmap messagemap;

這是乙個afx_msgmap型別的靜態成員變數,從其型別名稱和變數名稱可以猜出,它是乙個包含了訊息對映資訊的變數。的確,它把訊息對映的資訊(訊息對映陣列)和相關函式打包在一起,也就是說,得到了乙個訊息處理類的該變數,就得到了它全部的訊息對映資料和功能。afx_msgmap結構的定義如下:

struct afx_msgmap

;

成員函式 getmessagemap() 用來得到自身訊息對映的函式。

有了上面的乙個概念之後,應該很容易理解mfc在處理乙個訊息的時候,往_messageentries裡加入要處理的函式,然後通過messagemap就可以得到訊息對映陣列_messageentries和基類的訊息對映陣列的位址了

回頭看看mfc的訊息對映機制,了然了,在處理訊息的時候構建的那張表,

begin_message_map(cexampledlg, cdialogex)

on_wm_syscommand()

on_wm_paint()

on_wm_querydragicon()

end_message_map()

第乙個處理的訊息是on_wm_syscommand(),處理訊息函式(右擊轉到定義)onsyscommand

建好訊息對映表後,訊息就會流向到指定的處理函式裡。

差不多訊息對映機制就回顧了這麼多了,寫的很亂,放元旦擱了好幾天又開始寫的,思路接不上了呃。

MFC訊息對映機制

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

MFC訊息對映機制

win32的訊息迴圈機制是 產生的訊息交由作業系統,將其放到應用程式的訊息佇列中。應用程式通過getmessage函式從這個佇列中取出 一條訊息 由dispatchmessage函式把訊息又交給作業系統,作業系統呼叫視窗過程函式wndproc進行處理。該函式利用switch case結構來判斷並響應...

MFC訊息對映機制

mfc的設計者們在設計mfc時,緊緊把握乙個目標,那就是盡可能使得mfc的 要小,速度盡可能快。為了這個目標,他們使用了許多技巧,其中很多技巧體現在巨集的運用上,實現mfc的訊息對映的機制就是其中之一。同mfc訊息對映機制有關的巨集有下面幾個 declare message map 巨集 begin...