VC訊息對映機制小結

2021-06-21 05:30:21 字數 2853 閱讀 3903

對於一條mfc訊息響應函式,一般會有三處相關資訊。

1. 訊息響應函式宣告

project1dlg.h 

(如何多doc文件則是***view.h)

class cproject1dlg : public cdialog

;protected:

virtual void dodataexchange(cdataexchange* pdx); // ddx/ddv 支援

// 實現

protected:

hicon m_hicon;

// 生成的訊息對映函式

virtual bool oninitdialog();

afx_msg void onsyscommand(uint nid, lparam lparam);

afx_msg void onpaint();

afx_msg hcursor onquerydragicon();

declare_message_map()

public:

afx_msg void onbnclickedok();  //函式宣告,宣告了是訊息響應函式};

2. 訊息響應函式定義

project1dlg.cpp

void cproject1dlg::onbnclickedok()

3.  書寫訊息對映巨集,表示遇到該巨集對應訊息時,將訊息與訊息響應函式關聯,呼叫訊息響應函式

begin_message_map(cproject1dlg, cdialog)

on_wm_syscommand()

on_wm_paint()

on_wm_querydragicon()

//}}afx_msg_map

on_bn_clicked(idok, onbnclickedok)

end_message_map()

on_bn_clicked(idok, onbnclickedok)與onbnclickedok()  通過引數對應的關係顯得很清晰。而原有的vc機制常用on_wm_lbuttondown與響應函式onlbuttondown()對應,這對書寫有嚴格要求,不能錯,因為vc中存在了乙個訊息對映表這樣的東西,對每個訊息巨集(如on_wm_lbuttondown)都預定義了訊息對映函式(如onlbuttondown())這樣的虛函式,使用時定義一下就可以,但必須按對映表的原函式書寫才能關聯訊息巨集。

如何訊息對映表中沒有該訊息及響應函式,想自定義乙個。

轉乙個mfc自定義訊息的實現

1).在相關類的標頭檔案頂部新增如下所示的字串(以cmydlg類為例):

在cmydlg.h中新增#define wm_my_message (wm_user+100)  注意:在原始檔(。cpp)也可以的。

1  2

其中1位置處的訊息名可以自定,位置2處是確保訊息在程式中唯一性,所以用(wm_user+數值)的形式來表示,數值不可為負.

2).在訊息定義完成後,需要轉到相應類的源程式檔案cmydlg.cpp中,在如下所示的固定結構間新增訊息與函式的對映.

begin_message_map(ctestdisockdlg, cdialog)

//}afx_msg_map

end_message_map()

例如要新增上面已經定義好的訊息,新增後的結構如下:

begin_message_map(ctestdisockdlg, cdialog)

//}afx_msg_map

end_message_map()

其中3所示的行即是新增的內容.要注意自定義訊息是以on_message()的形式對映,第乙個引數是上面已經定義好的訊息名,第二個引數是該訊息的對映函式,訊息是函式的觸發條件.無訊息到達時該函式永遠不被執行.

3).上面的完成後,需要轉到cmydlg.h檔案中,也就是定義類的檔案中,在如下的結構中申明剛才對映好的函式.

//}afx_msg

declare_message_map() 

//找位置的時候,以該行出現的地方為準.

新增函式後的結構如下,與普通的申明稍有區別.

//}afx_msg

declare_message_map() 

//找位置的時候,以該行出現的地方為準,新增函式後的結構如下,與普通的申明稍有區別.

位置4對應的行是加上的函式申明,如果有引數就寫帶參的形式,其中afx_msg 頭是所有與訊息有關的函式必須加的標識.

最後一步就是到原始檔cmydlg.cpp中寫函式的實現部分,也就是具體的程式設計.

訊息的觸發是靠sendmessage()或postmessage()函式完成的,它們的第乙個引數就是指定把訊息發往那個視窗,傳送成功後,對映函式就會被呼叫執行。

on_command 對應的都是wm_command訊息,是使用者自定義訊息的較好發布者

兩者區別非常理論

口訊息(window message)一般與視窗的內部運作有關,如建立視窗、繪製視窗和銷毀窗

口等。通常,訊息是從系統傳送到視窗,或從視窗傳送到視窗。

若需要視窗訊息的完全的列表,請參考m f c文件。

命令訊息

命令訊息一般與處理使用者請求相關,當使用者單擊乙個選單項或工具欄時,命令訊息產生,

並被傳送到能處理該請求的類物件(如,裝載檔案、編輯文字和儲存選項等)。

控制項通知

通常,控制項通知在某些重要事件發生時,由控制項視窗傳送到父視窗,如開啟乙個組合框。

控制項通知為父視窗進一步控制子視窗提供了機會。例如,開啟乙個組合框時,父視窗可以用

組合框初建時得不到的訊息填充它。

on_command 和on_message都是將訊息處理函式加入訊息路由表中,但是on_command對應的訊息id一直都是wm_command,而on_message的訊息id為on_command的第乙個引數

VC訊息對映

vc訊息對映 2010年08月14日 視類增加乙個訊息相應函式後,在原始檔中都會增加三處 1 訊息相應函式原型。在cdrawview中會有這樣的 generated message map functions protected afx msg declare message map 在declar...

VC訊息對映

vc訊息對映 2010年08月14日 視類增加乙個訊息相應函式後,在原始檔中都會增加三處 1 訊息相應函式原型。在cdrawview中會有這樣的 generated message map functions protected afx msg declare message map 在declar...

訊息對映機制

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