windows
應用程式是訊息驅動的。在
mfc軟體開發
中,介面操作或者執行緒之間通訊都會經常用到訊息,通過對訊息的處理實現相應的操作。比較典型的過程是,使用者操作視窗,然後有訊息產生,送給視窗的訊息處理函式處理,對使用者的操作做出響應。
視窗訊息一般由三個部分組成:
乙個無符號整數,是訊息值;
訊息附帶的
wparam
型別的引數;
訊息附帶的
lparam
型別的引數。
其實我們一般所說的訊息是狹義上的訊息值,也就是乙個無符號整數,經常被定義為巨集。
mfc使用一種訊息對映機制來處理訊息,在應用程式框架中的表現就是乙個訊息與訊息處理函式一一對應的訊息對映表,以及訊息處理函式的宣告和實現等**。當視窗接收到訊息時,會到訊息對映表中查詢該訊息對應的訊息處理函式,然後由訊息處理函式進行相應的處理。
sdk程式設計時需要在視窗過程中一一判斷訊息值進行相應的處理,相比之下
mfc的訊息對映機制要方便好用的多。
先講下windows
訊息的分類。
windows
訊息分為系統訊息和使用者自定義訊息。
windows
系統訊息有三種: 標準
windows
訊息。除
wm_command
外以wm_
開頭的訊息是標準訊息,例如,
wm_create
、wm_close
。命令訊息。訊息名為
wm_command
,訊息中附帶了識別符號
id來區分是來自哪個選單、工具欄按鈕或加速鍵的訊息。
通知訊息。通知訊息一般由列表框等子視窗傳送給父視窗,訊息名也是
wm_command
,其中附帶了控制項通知碼來區分控制項。
cwnd
的派生類都可以接收到標準
windows
訊息、通知訊息和命令訊息。命令訊息還可以由文件類等接收。
使用者自定義訊息是實際上就是使用者定義乙個
巨集作為訊息,此巨集的值應該大於等於
wm_user
,然後此巨集就可以跟系統訊息一樣使用,視窗類中可以定義它的處理函式。
除了一些沒有基類的類或
cobject
的直接派生類外,其他的類都可以自動生成訊息對映表。下面的講解都以前面例程
helloworld
的cmainframe
為例。訊息對映表如下:
begin_message_map(cmainframe, cframewndex)
on_wm_create()
on_command(id_view_customize, &cmainframe::onviewcustomize)
on_registered_message(afx_wm_create*******, &cmainframe::on*******createnew)
on_wm_settingchange()
end_message_map() 在
begin_messag_map
和end_message_map
之間的內容成為訊息對映入口項。訊息對映除了在
cmainframe
的實現檔案中新增訊息對映表外,在類的定義檔案
mainfrm.h
中還會新增乙個巨集呼叫:
declare_message_map()
一般這個巨集呼叫寫在類定義的結尾處。
如何新增訊息處理函式呢?不管是自動還是手動新增都有三個步驟:
在類定義中加入訊息處理函式的函式宣告,注意要以
afx_msg
打頭。例如
mainfrm.h
中wm_create
的訊息處理函式的函式宣告:
afx_msg int oncreate(lpcreatestruct lpcreatestruct);
。在類的訊息對映表中新增該訊息的訊息對映入口項。例如
wm_create
的訊息對映入口項:
on_wm_create()
。在類實現中新增訊息處理函式的函式實現。例如,
mainfrm.cpp
中wm_create
的訊息處理函式的實現:
int cmainframe::oncreate(lpcreatestruct lpcreatestruct)
通過以上三個步驟以後,
wm_create
等訊息就可以在視窗類中被訊息處理函式處理了。
標準windows
訊息的訊息處理函式都與
wm_create
訊息類似。
命令訊息的訊息對映入口項形式如:
on_command(id_view_customize, &cmainframe:: onviewcustomize)
,訊息為
id_view_customize
,訊息處理函式為
onviewcustomize。
如果想要使用某個處理函式批量處理某些命令訊息,則可以像
cmainframe
訊息對映表中的
一樣新增訊息對映入口項,這樣值在
到之間的選單項等的命令訊息都由
cmainframe
的函式處理。函式原型為
,引數id
為使用者操作的選單項等的id。
在操作列表框等控制項時往往會給父視窗傳送
wm_notify
通知訊息。
wm_notify
訊息的wparam
引數為傳送通知訊息的控制項的id,
lparam
引數指向乙個結構體,可能是
nmhdr
結構體,也可能是第乙個元素為
nmhdr
結構體變數的其他結構體。
nmhdr
結構體的定義如下(僅作了解):
typedef sturct tagnmhdr nmhdr;
hwndfrom
為傳送通知訊息控制項的控制代碼,
idfrom
為控制項id
,code
為要處理的通知訊息的通知碼,例如
nm_click。
通知訊息的訊息對映入口項形式如:
on_notify(wnotifycode,id,memberfxn)
wnotifycode
為要處理的通知訊息通知碼,例如:
nm_click。id
為控制項標識id。
memberfxn
為此訊息的處理函式。
通知訊息的處理函式的原型為:
afx_msg void memberfxn( nmhdr * pnotifystruct, lresult * result);
如果需要使用使用者自定義訊息,首先要定義訊息巨集,如:
#define wm_update_wnd (wm_user+1)
,再到訊息對映表中新增訊息對映入口項:
on_message(wm_update_wnd, &cmainframe::onupdatewnd)
,然後在
mainfrm.h
中新增訊息處理函式的函式宣告:
afx_msg lresult onupdatewnd(wparam wparam, lparam lparam);
,最後在
mainfrm.cpp
中實現此函式。
MFC程式設計入門(MFC訊息對映機制概述)
前面已經說過,windows應用程式是訊息驅動的。在mfc 軟體開發 中,介面操作或者執行緒之間通訊都會經常用到訊息,通過對訊息的處理實現相應的操作。比較典型的過程是,使用者操作視窗,然後有訊息產生,送給視窗的訊息處理函式處理,對使用者的操作做出響應。什麼是訊息 視窗訊息一般由三個部分組成 1.乙個...
MFC訊息對映機制
一 mfc中採用的這種訊息處理機制成為 mfc訊息對映機制 乙個mfc訊息響應函式在程式中有三處相關資訊 函式原型,函式實現,關聯訊息和訊息響應函式的巨集。函式原型 標頭檔案cdrawview 兩個afx msg注釋巨集之間 訊息響應函式原型的宣告 afx msg void onlbuttondow...
MFC訊息對映機制
win32的訊息迴圈機制是 產生的訊息交由作業系統,將其放到應用程式的訊息佇列中。應用程式通過getmessage函式從這個佇列中取出 一條訊息 由dispatchmessage函式把訊息又交給作業系統,作業系統呼叫視窗過程函式wndproc進行處理。該函式利用switch case結構來判斷並響應...