這是從新對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_msgdeclare_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.在...