VC MFC的訊息對映機制

2021-07-22 13:25:34 字數 1663 閱讀 4499

①、對映機制的原理

windows 下的程式包括 windows 系統都是基於訊息機制的。

mfc訊息對映機制的具體實現方法是:在每個能接收和處理訊息的類中,定義乙個訊息和訊息響應函式的靜態對照表,即訊息對映表;

在訊息對映表中,訊息與對應的訊息處理函式指標是成對出現的。某個類能處理的所有訊息及其對應的訊息處理函式的位址都列在這個類所對應的靜態表中;

當有訊息需要處理時,程式只要搜尋該訊息靜態表,檢視表中是否含有該訊息,就可以知道該類能否處理此訊息;

如果能處理該訊息,則同樣依照靜態錶能很容易找到並呼叫對應的訊息處理函式!

②、一般情況下,乙個mfc的訊息對映在程式中有三處相關資訊:1》訊息響應函式的宣告 2》訊息響應函式實現 3》用來關聯訊息和訊息響應函式的巨集

具體見示例**……更為詳細的講解參見《深入淺出mfc 第二版 簡體中文版》 - 侯傑:

③、針對不同的 windows 訊息,mfc提供了不同的訊息對映巨集,主要分為如下六類:

1、windows 訊息對映巨集

windows 訊息對映巨集用於處理普通的視窗訊息。此類訊息對映巨集字首為「on_wm_」,並且沒有引數;

2、命令訊息對映巨集

命令訊息 wm_command 是一種特殊的視窗訊息,它從乙個視窗傳送到另乙個視窗,以處理來自使用者的請求,是 on_command 巨集和 on_command_range 巨集;

3、控制項通知訊息對映巨集

控制項通知訊息是指控件視窗傳送到其父視窗的訊息,其訊息對映巨集為 on_control 和 on_control_range,有時在程式中並不見 on_control 巨集,而見 on_bn_clicked 巨集,

其實 on_control 巨集派生出許多的對映巨集,包括 on_bn_clicked 巨集等;

4、控制項通知訊息對映巨集

控制項通知訊息對映巨集處理的視窗訊息有 wm_command,wm_notify,其訊息對映巨集有 on_notify 和 on_notify_range;

5、反射訊息對映巨集

反射訊息是指子視窗向父視窗傳送的通知訊息或控制項通知訊息,父視窗將該訊息轉化為相應的反射訊息傳送給子視窗優先處理。

處理視窗訊息 wm_notify+wm_reflect_base 的巨集是 on_notify_reflect,處理視窗訊息 wm_command+wm_reflect_base 的巨集是 on_control_reflect,

還有其他的反射訊息巨集,具體請參考mdsn。

6、擴充套件訊息對映巨集

有 on_command | on_command_range | on_notify | on_notify_range ……

④、自定義訊息的傳送與響應:

1、自定義訊息號:#define wm_cctry_msg (wm_user+100)

2、在標頭檔案中新增訊息響應函式的宣告:afx_msg lresult oncctrymsg(wparam wparam, lparam lparam);

3、在cpp檔案中新增訊息響應函式的實現:

lresult c***dlg::oncctrymsg(wparam wparam, lparam lparam)

4、在 begin_message_map 與 end_message_map 之間加入訊息的對映**:on_message(wm_cctry_msg, &cdlgtestdlg::oncctrymsg)

5、訊息的傳送:

VC MFC訊息對映機制詳解

windows程式和mfc程式是靠訊息驅動的,他們對於訊息的處理本質上是相同的。只是windows程式對於訊息處理的過程十分清晰明了,mfc程式則掩蓋了訊息處理的過程,以訊息對映的方式呈現在開發者面前,使得開發訊息的處理十分簡單。用多了mfc就想對它的訊息對映機制有乙個本質的了解,下面將對訊息對映做...

VC MFC訊息對映機制詳解

windows程式和mfc程式是靠訊息驅動的,他們對於訊息的處理本質上是相同的。只是windows程式對於訊息處理的過程十分清晰明了,mfc程式則掩蓋了訊息處理的過程,以訊息對映的方式呈現在開發者面前,使得開發訊息的處理十分簡單。用多了mfc就想對它的訊息對映機制有乙個本質的了解,下面將對訊息對映做...

訊息對映機制

大家看的出下面程式的錯誤嗎?include include message.h class myframe public cframewnd myframe afx msg void onexit afx msg void onlbuttondown uint nflags,cpoint point...