視窗訊息的傳遞(二)

2021-05-27 11:55:07 字數 2038 閱讀 5032

本文根據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程式中,經常會遇到這樣的問題,父視窗需要子視窗的值進行更新,或者新建立的子視窗需要一些父視窗的控制項變數。遇到這個問題,一般有兩種方式,一種是建立訊息,宣告乙個新的系統訊息及訊息響應函式,通過訊息觸發響應函式進行工作。第二種就是筆者比較傾向的一種,在子視窗類中建立父視窗類的指標物件,然後在父...