轉(zhuǎn)帖|使用教程|編輯:鮑佳佳|2021-01-06 10:51:55.133|閱讀 979 次
概述:在MFC軟件開發(fā)中,界面操作或者線程之間通信都會經(jīng)常用到消息,通過對消息的處理實(shí)現(xiàn)相應(yīng)的操作。比較典型的過程是,用戶操作窗口,然后有消息產(chǎn)生,送給窗口的消息處理函數(shù)處理,對用戶的操作做出響應(yīng)。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
上一講為大家簡單分析了MFC應(yīng)用程序框架,這一講是關(guān)于MFC消息映射機(jī)制的內(nèi)容。
前面已經(jīng)說過,Windows應(yīng)用程序是消息驅(qū)動的。在MFC軟件開發(fā)中,界面操作或者線程之間通信都會經(jīng)常用到消息,通過對消息的處理實(shí)現(xiàn)相應(yīng)的操作。比較典型的過程是,用戶操作窗口,然后有消息產(chǎn)生,送給窗口的消息處理函數(shù)處理,對用戶的操作做出響應(yīng)。
為大家推薦一個MFC開發(fā)庫Xtreme ToolKit Pro。
Xtreme Toolkit Pro是MFC開發(fā)中最全面界面控件套包,它提供了Windows開發(fā)所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
什么是消息
窗口消息一般由三個部分組成:1.一個無符號整數(shù),是消息值;(2)消息附帶的WPARAM類型的參數(shù);(3)消息附帶的LPARAM類型的參數(shù)。其實(shí)我們一般所說的消息是狹義上的消息值,也就是一個無符號整數(shù),經(jīng)常被定義為宏。
什么是消息映射機(jī)制
MFC使用一種消息映射機(jī)制來處理消息,在應(yīng)用程序框架中的表現(xiàn)就是一個消息與消息處理函數(shù)一一對應(yīng)的消息映射表,以及消息處理函數(shù)的聲明和實(shí)現(xiàn)等代碼。當(dāng)窗口接收到消息時,會到消息映射表中查找該消息對應(yīng)的消息處理函數(shù),然后由消息處理函數(shù)進(jìn)行相應(yīng)的處理。SDK編程時需要在窗口過程中一一判斷消息值進(jìn)行相應(yīng)的處理,相比之下MFC的消息映射機(jī)制要方便好用的多。
Windows消息分類
先講下Windows消息的分類。Windows消息分為系統(tǒng)消息和用戶自定義消息。Windows系統(tǒng)消息有三種:
1.標(biāo)準(zhǔn)Windows消息。除WM_COMMAND外以WM_開頭的消息是標(biāo)準(zhǔn)消息。例如,WM_CREATE、WM_CLOSE。
2.命令消息。消息名為WM_COMMAND,消息中附帶了標(biāo)識符ID來區(qū)分是來自哪個菜單、工具欄按鈕或加速鍵的消息。
3.通知消息。通知消息一般由列表框等子窗口發(fā)送給父窗口,消息名也是WM_COMMAND,其中附帶了控件通知碼來區(qū)分控件。
CWnd的派生類都可以接收到標(biāo)準(zhǔn)Windows消息、通知消息和命令消息。命令消息還可以由文檔類等接收。
用戶自定義消息是實(shí)際上就是用戶定義一個宏作為消息,此宏的值應(yīng)該大于等于WM_USER,然后此宏就可以跟系統(tǒng)消息一樣使用,窗口類中可以定義它的處理函數(shù)。
消息映射表
除了一些沒有基類的類或CObject的直接派生類外,其他的類都可以自動生成消息映射表。下面的講解都以前面例程HelloWorld的CMainFrame為例。消息映射表如下:
C++代碼
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx) ON_WM_CREATE() ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize) ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew) ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook) ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook) ON_WM_SETTINGCHANGE() END_MESSAGE_MAP()
在BEGIN_MESSAG_MAP和END_MESSAGE_MAP之間的內(nèi)容成為消息映射入口項(xiàng)。消息映射除了在CMainFrame的實(shí)現(xiàn)文件中添加消息映射表外,在類的定義文件MainFrm.h中還會添加一個宏調(diào)用:
DECLARE_MESSAGE_MAP()
一般這個宏調(diào)用寫在類定義的結(jié)尾處。
添加消息處理函數(shù)
如何添加消息處理函數(shù)呢?不管是自動還是手動添加都有三個步驟:
1.在類定義中加入消息處理函數(shù)的函數(shù)聲明,注意要以afx_msg打頭。例如MainFrm.h中WM_CREATE的消息處理函數(shù)的函數(shù)聲明:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);。
2.在類的消息映射表中添加該消息的消息映射入口項(xiàng)。例如WM_CREATE的消息映射入口項(xiàng):ON_WM_CREATE()。
3.在類實(shí)現(xiàn)中添加消息處理函數(shù)的函數(shù)實(shí)現(xiàn)。例如,MainFrm.cpp中WM_CREATE的消息處理函數(shù)的實(shí)現(xiàn):
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
}
通過以上三個步驟以后,WM_CREATE等消息就可以在窗口類中被消息處理函數(shù)處理了。
各種Windows消息的消息處理函數(shù)
標(biāo)準(zhǔn)Windows消息的消息處理函數(shù)都與WM_CREATE消息類似。
命令消息的消息映射入口項(xiàng)形式如:ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize),消息為ID_VIEW_CUSTOMIZE,消息處理函數(shù)為OnViewCustomize。
如果想要使用某個處理函數(shù)批量處理某些命令消息,則可以像CMainFrame消息映射表中的ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)一樣添加消息映射入口項(xiàng),這樣值在ID_VIEW_APPLOOK_WIN_2000到ID_VIEW_APPLOOK_WINDOWS_7之間的菜單項(xiàng)等的命令消息都由CMainFrame的OnApplicationLook函數(shù)處理。函數(shù)原型為afx_msg void OnApplicationLook(UINT id);,參數(shù)id為用戶操作的菜單項(xiàng)等的ID。
在操作列表框等控件時往往會給父窗口發(fā)送WM_NOTIFY通知消息。WM_NOTIFY消息的wParam參數(shù)為發(fā)送通知消息的控件的ID,lParam參數(shù)指向一個結(jié)構(gòu)體,可能是NMHDR結(jié)構(gòu)體,也可能是第一個元素為NMHDR結(jié)構(gòu)體變量的其他結(jié)構(gòu)體。NMHDR結(jié)構(gòu)體的定義如下(僅作了解):
Typedef sturct tagNMHDR{ HWND hwndFrom; UINT idFrom; UINT code; } NMHDR;
hwndFrom為發(fā)送通知消息控件的句柄,idFrom為控件ID,code為要處理的通知消息的通知碼,例如NM_CLICK。
通知消息的消息映射入口項(xiàng)形式如:
ON_NOTIFY(wNotifyCode,id,memberFxn)
wNotifyCode為要處理的通知消息通知碼,例如:NM_CLICK。id為控件標(biāo)識ID。MemberFxn為此消息的處理函數(shù)。
通知消息的處理函數(shù)的原型為:
afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result);
如果需要使用用戶自定義消息,首先要定義消息宏,如:#define WM_UPDATE_WND (WM_USER+1),再到消息映射表中添加消息映射入口項(xiàng):ON_MESSAGE(WM_UPDATE_WND, &CMainFrame::OnUpdateWnd),然后在MainFrm.h中添加消息處理函數(shù)的函數(shù)聲明:afx_msg LRESULT OnUpdateWnd(WPARAM wParam, LPARAM lParam);,最后在MainFrm.cpp中實(shí)現(xiàn)此函數(shù)。
本節(jié)對MFC消息映射機(jī)制只是做了比較簡單的講解,讓大家對它有一定的認(rèn)識,編程入門者不必強(qiáng)求完全掌握。在以后的教程中會經(jīng)常涉及到消息的使用,大家會逐漸熟悉MFC的消息映射機(jī)制。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn