本文根據codeproject的一片文章翻譯:
當乙個視窗接收到某個訊息後,mfc將呼叫類的成員函式。但是mfc如何知道該呼叫哪個函式呢?
為了解決上述問題,mfc運用了乙個叫做訊息對映(message map)機制。訊息對映就是將訊息和所要呼叫的函式繫結在一起。一旦接受到乙個訊息,mfc將進入訊息對映去尋找與該訊息相對應的訊息控制代碼。
mfc採用的是一系列的巨集(macros)去新增訊息對映到類中。當運用classwizard去新增乙個訊息控制代碼時首先新增該 函式到類中然後新增響應的巨集到訊息對映中。例如若用classwizard新增wm_close的訊息控制代碼時,會有一下三個動作:
1.在類的實現(.cpp)中的訊息對映中:
begin_message_map(caboutdlg, cdialog)
//}afx_msg_map
end_message_map()
2.在類(.h)宣告中宣告函式:該函式前有afx_msg關鍵字
protected:
//}afx_msg
declare_message_map()
3.在類的實現(.cpp)中:
void caboutdlg::onclose()
巨集declare_message_map()告知mfc給訊息對映新增必要的**。
巨集begin_message_map()表示訊息對映的開始,括弧類的兩個引數指示了傳送訊息的類和其基類。
巨集end_message_map()表示訊息對映的結束。
有一些訊息classwizard並不支援但是可以手工新增。但有得時候沒有訊息對映巨集,這個時候可以採用通用巨集on_message,利用該巨集可以傳遞任何訊息。
afx_msg lresult onmessage(wparam wparam, lparam lparam);
on_message (wm_gettextlength, ongettextlength)
ongettextlength的原形為:
afx_msg lresult ongettextlength(wparam wparam, lparam lparam);
//...
pyourdialog->sendmessage(wm_deleteall, 0, 0);
運用巨集wm_message完成訊息對映,將wm_deleteall與控制代碼函式ondeleteall()繫結。
//...
//message map entry:
on_message (wm_deleteall, ondeleteall)
//ondeleteall is prototyped as
afx_msg lresult ondeleteall(wparam wparam, lparam lparam);
//and is implemented as
lresult ondeleteall(wparam wparam, lparam lparam)
registerwindowmessage()用於定義乙個新的視窗訊息,必須保證其獨一無二。巨集
on_registered_message表示該訊息。例如:
class cmywnd : public cmyparentwndclass
}afx_msg
declare_message_map()
};begin_message_map(cmywnd, cmyparentwndclass)
//}afx_msg_map
end_message_map()
用該方式定義的訊息的範圍為0xc000 - 0xffff,並採用sendmessage()傳送該訊息。
//...
pfindwindow->sendmessage(wm_find, lparam, wparam);
子視窗與父視窗的訊息傳遞
昨天碰到乙個問題,如果乙個dialog上有乙個edit控制項,這時候對edit輸入文字是edit先得到的按鍵訊息還是父視窗先得到?如果要攔截乙個edit的回車訊息,在沒有為edit派生新的類的情況下,網上大部分的做法是過載父視窗的pretranlatemessage 在這裡對按鍵訊息進行攔截,但是大...
Android視窗管理(2) 訊息傳遞
本文內容參考 android 核心分析 13 android gwes之android視窗管理window是頂級的視窗概念,而activity中的decorview則是視窗中的頂級view,建立activity時,decorview會attach到activity的視窗中,同時也被加入到window...
MFC中父視窗和子視窗訊息的傳遞
在mfc程式中,經常會遇到這樣的問題,父視窗需要子視窗的值進行更新,或者新建立的子視窗需要一些父視窗的控制項變數。遇到這個問題,一般有兩種方式,一種是建立訊息,宣告乙個新的系統訊息及訊息響應函式,通過訊息觸發響應函式進行工作。第二種就是筆者比較傾向的一種,在子視窗類中建立父視窗類的指標物件,然後在父...