MFC學習筆記 訊息對映機制afx

2021-07-15 08:57:57 字數 2760 閱讀 3121

前面已經說過,windows應用程式是訊息驅動的。在mfc軟體開發中,介面操作或者執行緒之間通訊都會經常用到訊息,通過對訊息的處理實現相應的操作。比較典型的過程是,使用者操作視窗,然後有訊息產生,送給視窗的訊息處理函式處理,對使用者的操作做出響應。

視窗訊息一般由三個部分組成:1.乙個無符號整數,是訊息值;(2)訊息附帶的wparam型別的引數;(3)訊息附帶的lparam型別的引數。其實我們一般所說的訊息是狹義上的訊息值,也就是乙個無符號整數,經常被定義為巨集。

mfc使用一種訊息對映機制來處理訊息,在應用程式框架中的表現就是乙個訊息與訊息處理函式一一對應的訊息對映表,以及訊息處理函式的宣告和實現等**。當視窗接收到訊息時,會到訊息對映表中查詢該訊息對應的訊息處理函式,然後由訊息處理函式進行相應的處理。sdk程式設計時需要在視窗過程中一一判斷訊息值進行相應的處理,相比之下mfc的訊息對映機制要方便好用的多。

先講下windows訊息的分類。windows訊息分為系統訊息和使用者自定義訊息。windows系統訊息有三種:

1.標準windows訊息。除wm_command外以wm_開頭的訊息是標準訊息。例如,wm_create、wm_close。

2.命令訊息。訊息名為wm_command,訊息中附帶了識別符號id來區分是來自哪個選單、工具欄按鈕或加速鍵的訊息。

3.通知訊息。通知訊息一般由列表框等子視窗傳送給父視窗,訊息名也是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()

一般這個巨集呼叫寫在類定義的結尾處。

如何新增訊息處理函式呢?不管是自動還是手動新增都有三個步驟:

1.在類定義中加入訊息處理函式的函式宣告,注意要以afx_msg打頭。例如mainfrm.h中wm_create的訊息處理函式的函式宣告:afx_msg int oncreate(lpcreatestruct lpcreatestruct);。

2.在類的訊息對映表中新增該訊息的訊息對映入口項。例如wm_create的訊息對映入口項:on_wm_create()。

3.在類實現中新增訊息處理函式的函式實現。例如,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。

在操作列表框等控制項時往往會給父視窗傳送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學習筆記之訊息對映機制

0x00 windows應用程式都是訊息驅動,其中mfc,其介面操作或者執行緒間通訊是通過處理訊息實現相應的操作,如使用者在操作視窗時會產生訊息,將其送給視窗的訊息處理函式,對使用者的操作做出對應的響應。0x01 訊息 mfc的視窗訊息含三個部分 1 訊息值 乙個無符號整數,經常被定義為巨集 2 訊...

MFC訊息對映機制

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

MFC訊息對映機制

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