mfc 中通過通過不同於sdk的switch的方法來處理windows訊息,
由訊息對映表(message map)和虛函式多型來處理指定的窗體訊息
1 宣告乙個訊息對映表(message map)
在能處理訊息的類中中新增巨集
declare_message_map()
注 深入淺出
mfc中有更詳盡系統的概述 這裡只介紹幾個巨集定義
這個巨集實現了3個功能
:1 私有資料成員宣告
afx_messagemap_entry _messageentries;陣列
2 保護資料成員宣告
afx_message_map _messagemap指向_messageentrie陣列
3宣告並定義虛保護成員函式
getmessagemap()用於得到 _messagemap的位址
巨集的實現及相關的成員變數
注意 具有訊息處理得類必須從
ccmdtarget派生而來
ccmdtarget派生的類至少可以處理
wm_command訊息而只有訊息的派發可以參看
cmdtarg.cpp中的函式實現
afx_static bool afxapi _afxdispatchcmdmsg()派發訊息的函式)
類具有處理窗體的訊息必須要從
cwnd類中派生
以下是 cwnd及其派生類處理並派發訊息的成員函式
cwnd::onwndmsg(uint message, wparam wparam, lparam lparam, lresult* presult)
2實現乙個訊息對映表
在類的實現檔案中新增訊息對映表
表頭巨集
begin_message_map(cmyclass, cbaseclass)
表未巨集
end_message_map()
在表中新增相關的巨集可以實現過濾 攔截處理訊息 否則訊息會順著訊息對映表在類的派生結構中流向基類
2.1處理標準
window訊息巨集
(afxmsg_.h的標頭檔案中找到相關巨集定義
)在訊息對映表中新增
on_wm_***(***為訊息名稱)
ie:如在乙個窗體中處理
wm_paint訊息
begin_message_map(cmywnd, cbasewnd)
on_wm_paint()
end_message_map()
還需新增乙個對應的處理
wm_paint的成員函式在cmywnd中
標準 windows訊息處理on_wm_***對應的成員函式型別可以在
注意:該功能可以通過
class winzard來完成
2.2處理
command訊息的訊息對映表巨集
(afxmsg_.h的標頭檔案中找到相關巨集定義
)command訊息一般是由選單命令和加速健按下產生的
2.2.1
on_command
on_command(cmd_id oncmdfunc)
afx_msg void oncmdfunc();
注意:可以由
class winzard完成
2.2.2
on_command_ui
on_command_ui (cmd_id, onupdatecmduifunc)
afx_msg void onupdatecmduifunc(ccmdui* pcmdui);
注意:可以由
class winzard完成
2.2.3
on_command_range
on_command_range(start_id, end_id, oncmdrangefunc)
afx_msg void oncmdrangefunc (int id)
注意:不可以由
class winzard完成
2.2.4
on_command_ui_range
on_command_ui_range (start_id, end_id, onupdatecmduifunc)
afx_msg void onupdatecmduifunc(ccmdui* pcmdui);
注意:不可以由
class winzard完成
2.2.5
on_command_ex
on_command_ex (id, oncmd)
bool oncmd()返回
ture表示訊息得到處理, 否則訊息會在訊息路由中繼續流動
類似於異常的再次丟擲
注意:不可以由
class winzard完成
2.3處理使用者自定義訊息
on_message(wm_userdefined, onmsg)
hresult onmsg(wparam , lparam);
使用者定義的訊息的值可以定義
wm_user - 0x7fff之間
2.4處理註冊訊息
(系統級)
::registerwindowmessage()
通過這個
api可以在系統中註冊乙個訊息並保證在系統內部是唯一的
處理這樣的訊息的巨集
on_registered_message(wm_registered_msg, onmsg)
afx_msg hresult onmsg(wparam, lparam);
2.5處理控制項訊息
控制項傳送給父窗體的通知訊息父窗體可以在這時改變一些空間的狀態或做出響應
wm_notify的訊息
on_notify( wnotifycode, id, memberfxn )
afx_msg void memberfxn( nmhdr * pnotifystruct, lresult * result );
on_notify_range( wnotifycode, id, idlast, memberfxn )
可以用於處理一些標準的空間通知訊息
當要處理使用者自己定義的控制項訊息時必須用巨集
on_control(wnotifycode, id, memberfxn)
on_control_range( wnotifycode, id1, id2, memberfxn )
3相關巨集的定義
/// window message map handling
struct afx_msgmap_entry;
// declared below after cwnd
struct afx_msgmap
;#ifdef _afxdll
#define declare_message_map() /
private: /
static const afx_msgmap_entry _messageentries; /
protected: /
static afx_data const afx_msgmap messagemap; /
static const afx_msgmap* pascal _getbasemessagemap(); /
virtual const afx_msgmap* getmessagemap() const; /
#else
#define declare_message_map() /
private: /
static const afx_msgmap_entry _messageentries; /
protected: /
static afx_data const afx_msgmap messagemap; /
virtual const afx_msgmap* getmessagemap() const; /
#endif
#ifdef _afxdll
#define begin_message_map(theclass, baseclass) /
const afx_msgmap* pascal theclass::_getbasemessagemap() /
/const afx_msgmap* theclass::getmessagemap() const /
/afx_comdat afx_datadef const afx_msgmap theclass::messagemap = /
; /afx_comdat const afx_msgmap_entry theclass::_messageentries = /
/afx_comdat afx_datadef const afx_msgmap theclass::messagemap = /
; /afx_comdat const afx_msgmap_entry theclass::_messageentries = /
/}; /
MFC 訊息對映表 及 相關巨集定義
mfc相關技術說明 可參閱msdn mfc tno 5 mfc 中通過通過不同於sdk的switch的方法來處理windows訊息,由訊息對映表 message map 和虛函式多型來處理指定的窗體訊息 宣告乙個訊息對映表 message map 在能處理訊息的類中中新增巨集 declare mes...
MFC訊息對映巨集說明
1 declare message map 在標頭檔案中宣告原始檔中所含有的訊息對映 2,begin message map 標記原始檔訊息對映的開始 3,end message ma 標記原始檔訊息對映的結束 4,on command 將特定命令的處理委派給類的乙個成員函式 5,on contro...
如果MFC的訊息對映表需要排序
這是今天下班前和同事討論的問題。mfc的訊息對映通過幾個簡單的巨集,對windows的訊息機制做了非常好的物件導向封裝,一時為無數c 程式設計師所模仿 當然,mfc可能也是模仿別人的 熟悉mfc訊息對映機制的人都知道,其本質無非就是把訊息和其處理函式放到乙個陣列當中,當程式接收到某訊息時,就會遍歷該...