VC中自定義訊息響應函式

2022-07-03 16:51:12 字數 1868 閱讀 1409

這是從新對windows的自定義訊息響應函式進行整理。因為我發現自定義訊息響應函式還是非常有用的,尤其是在windows多程式設計中,用的類越多,有時候就比較有用。

windows訊息用"wm_"這個字首,自定義的訊息一般用"um_這個字首"。

1.建立響應函式的原型:

在vs2005中,對於響應函式有了個比較嚴格的規定,導致以前vc6裡面有很多不能直接使用,原型如下:

cpp** 

afx_msg lresult (cwnd::)myfnx(wparam wparam,lparam lparam)  

對於返回型別與引數都不能少。將響應函式新增在標頭檔案當中:

cpp** 

......     

// 生成的訊息對映函式     

protected:     

......     

afx_msg lresult myfnx(wparam wparam, lparam lparam);     

......     

declare_message_map()     

......    

2.定義訊息:

在類的標頭檔案中新增乙個自定義的訊息:

#define um_mymsg wm_user+1  

這樣um_mymsg就是對應的訊息。

3.將訊息對映到響應函式:

在類的原始檔中新增對映關係:

.......     

begin_message_map(cmainframe, cframewnd)     

......     

on_message(um_mymsg,myfnx)     

......     

end_message_map()     

......   

4.響應函式的具體實現:

在原始檔中新增上成員函式myfnx的具體實現:

cpp** 

lresult cwnd::myfnx(wparam wparam, lparam lparam)     

5.在需要使用到該函式的地方發出訊息

cpp**

postmessage(my_msg,wparam,lparam);     

//將訊息加入等待佇列,不會馬上執行     

//sendmessage(my_msg,wparam,lparam)則不同,會馬上執行 

下面我們舉乙個實際的例子來說明該段過程.例如在對話方塊中設定乙個按鈕,每隔3秒鐘會自動的彈出message對話方塊:

(1)首先在標頭檔案或cpp檔案中定義乙個訊息

#define click_message_box  wm_user+100

(2)然後在訊息對映巨集裡面新增函式宣告:

//}afx_msg

declare_message_map()

afx_msg void onresponse(int num);

我們一般將自定義的訊息解除安裝afx_msg的外面

begin_message_map(cmy41dlg, cdialog)

//}afx_msg_map

end_message_map()

(4)定義響應函式

void cmy41dlg::onresponse(int num)

(5)傳送訊息:

postmessage(click_message_box,1);

需要注意的是,postmessage函式後面帶有引數,可以向響應函式裡面傳參,例如上面的例子中,我們在(5)的訊息函式中有乙個int num,其實就是postmessage函式傳過來的引數1。 

VC 中新增訊息響應函式

我們舉乙個實際的例子來說明該段過程.例如在對話方塊中設定乙個按鈕,每隔3秒鐘會自動的彈出message對話方塊 1 首先在標頭檔案或cpp檔案中定義乙個訊息 define click message box wm user 100 2 然後在訊息對映巨集裡面新增函式宣告 afx msg declar...

VS2008中MFC自定義訊息響應函式

這段時間看vc 深入詳解.看到新增自定義訊息那一節,按照書上的方法就是編譯不通過.vc6.0和vs2008中新增訊息的方法不同.現在就把新增自定義訊息的方法記錄下來 紅色標記的地方為不同之處.1.定義訊息 define um progress wm user 1 2.類標頭檔案中宣告訊息響應函式 o...

VC 中新增響應自定義訊息

define wm debug wm user 1 2.在視窗標頭檔案中新增 比如mainframe.h class cmainframe public cframewnd afx msg afx msg lresult ondebug wparam wparam,lparam lparam 3.在...