當前位置:首頁 > 芯聞號 > 充電吧
[導讀]1、命令消息(WM_COMMAND所有派生自?CCmdTarget?的類都有資格接受WM_COMMAND。 2、Window消息(WM_xxx) 所有派生自?CWnd?的類都有資格接受?WM_xxx。

1、命令消息(WM_COMMAND

所有派生自?CCmdTarget?的類都有資格接受WM_COMMAND。

2、Window消息(WM_xxx)
所有派生自?CWnd?的類都有資格接受?WM_xxx。

3、控件消息(WM_NOTIFY)
控件向其父窗口通知消息。

消息處理
1、WM_xxx?消息處理
窗口類(自身)處理→基類處理→CWnd∷DefWindowProc()處理;
其所對應的宏一般為在消息?WM_?前面加上?ON_。

2、命令消息處理
命令消息來自命令用戶接口對象(菜單、加速鍵或工具欄按鈕)發(fā)出的WM_COMMAND消息;
㈠、WM_COMMAND消息
其所包含的類型和對應的宏如下:
①、ON_COMMAND(ID,pfn)
標準的命令消息;

②、ON_COMMAND_EX(ID,pfn)
多個命令?ID?提供相同的處理,每個ID都要單獨使用一個ON_COMMAND_EX,ID可以不連續(xù)、多個對象對同一個命令?ID?的處理;
其函數(shù)的原型如下:
afx_msg?BOOL?pfn(UINT?nID)
說明:
當返回?TRUE?時表示已經(jīng)處理,不用在消息處理鏈中繼續(xù)處理該命令;為?FALSE?時表示繼續(xù)在消息處理鏈中處理該命令。
注意:
其一:在多對象處理中一定要使用該宏;
其二:pfn(UINT?nID)(消息處理函數(shù))返回值將其類型void改成BOOL,而且必須為FALSE;
其三:多個對象的處理是由高層向低層的過程:即視圖類→主框架窗口類→應用程序類;

③、ON_COMMAND_RANGE(nID,nLastID,pfn)
多個命令?ID?提供相同的處理、多個對象對同一個命令?ID?的處理;?

注意:
其一:確保nID、nLastID的值在?Resource.h?中是連續(xù)的。
其二:一般在函數(shù)?pfn(UINT?nID)?中加入?yún)?shù),用來確定那一個按鈕點擊。

㈡、CN_UPDATE_COMMAND_UI消息
當菜單項、工具欄按鈕等[命令用戶接口對象]要更新其狀態(tài)時所對應的消息,它所包含的類型和對應的宏如下:
①、ON_UPDATE_COMMAND_UI(ID,pfn)
其中函數(shù)的原型如下:
afx_msg?void?pfn(CCmdUI*?pCmdUI)

②、ON_UPDATE_COMMAND_UI_RANGE(nID,nLastID,pfn)
該函數(shù)可以處理一組[命令用戶接口對象]的外觀;
其中函數(shù)的原型如下:
afx_msg?void?pfn(CCmdUI*?pCmdUI)
重要:
CCmdUI?中的?m_nID?成員表示不同的?ID,因此可以利用它來進行區(qū)別處理。

3、控件的通知消息
從控件和子窗口發(fā)送到父窗口的WM_COMMAND通知消息(即在發(fā)送命令消息中加入控件的通知碼)。
注意:在?Window9x?新控件中不再傳送WM_COMMAND通知消息,而是發(fā)送?WM_NOTIFY?消息,但為了兼容,舊有的控件還是傳送WM_COMMAND消息。
例如:
CEdit控件向父窗口發(fā)送?EN_CHANGE?通知代碼的WM_COMMAND消息。
注意:框架像傳送其它?WM_?消息一樣傳送通知消息,但有一個例外,即由?[按鈕]?控件發(fā)送的?BN_CLICKED?通知消息,被作為命令消息特別處理。
㈠、WM_COMMAND?其所對應的宏如下:
①、ON_CONTROL(通知碼,?nID,fn)
②、ON_CONTROL_RANGE(通知碼,?nFirstID,nEndID,fn)
注意:
這兩個宏的應用和?ON_COMMAND、ON_COMMAND_RANGE相同,所不同的是在宏前面加入[通知碼]。
注意:可以根據(jù)不同的控件的[通知碼]派生出特定的宏,其所派生的宏一般為在?[通知碼]?前面加上?ON_。
㈡、WM_NOTIFY?其所對應的宏如下:
①、ON_NOTIFY(通知碼,?nID,fn)
其中函數(shù)的原型如下:
afx_msg?void?fn(NMHDR*?pNotifyStruct,LRESULT*?result)
其中結(jié)構(gòu):
typedef?struct?tagNMHDR?{?
HWND?hwndFrom;?//發(fā)送通知消息的控件的句柄;
UINT?idFrom;?//發(fā)送通知消息的控件的?ID;
UINT?code;?//通知碼;
}?NMHDR;?

②、ON_NOTIFY_EX(通知碼,?nID,fn)
表示一個消息在多個對象的成員函數(shù)中進行處理。
其中函數(shù)的原型如下:
afx_msg?BOOL?fn(UINT?nID,NMHDR*?pNotifyStruct,LRESULT*?result)
說明:
它必須返回?BOOL?類型的數(shù)值,其意義和?ON_COMMAND_EX?相同。

③、ON_NOTIFY_RANGE(通知碼,?nFirstID,nEnd,fn)
表示多個控件的通知消息在同一個函數(shù)中進行處理。
其中函數(shù)的原型如下:
afx_msg?void?fn(UINT?nID,NMHDR*?pNotifyStruct,LRESULT*?result)
說明:
其意義和ON_COMMAND_RANGE相同。

4、反射消息處理
父窗口在處理控件窗口的通知消息WM_CTLCOLOR、WM_COMMAND、WM_NOTIFY時,會把該消息轉(zhuǎn)化為反射消息,并轉(zhuǎn)交給控件子窗口處理,只有在控件子窗體不處理該消息時,父窗口才有機會處理。
注意:在類的屬性對話框中的消息頁面可查反射消息(前面有"="標志)
①、WM_CTLCOLOR_REFLECT反射消息
其所對應的宏如下:
ON_WM_CTLCOLOR_REFLECT()
反射消息函數(shù)的原型:
HBRUSH?class_name∷CtlColor(CDC*?pDC,UINT?nCtlColor)
{
return?NULL;
}
該函數(shù)用來重置控件的顔色;注意:必須?return?CBrush才有效。


5、自定義的窗口消息
自定義窗口消息的消息標志都大于WM_USER(至少是WM_USER+100,因為許多控件都使用這一范圍的WM_USER消息)
使用自定義的消息分為二步:
①、在?Resource.h?中定義消息標記
#define?WM_MYMSG?(WM_USER+1000)

②、在消息映射表中加入消息映射宏
BEGIN_MESSAGE_MAP()

ON_MESSAGE(WM_MYMSG,fn)
END_MESSAGE_MAP()
說明:
其對應的宏為?ON_MESSAGE(),其成員函數(shù)的原型為:
afx_msg?LRESULT?fn(WPARAM,LPARAM)

6、登記消息
①、在系統(tǒng)中注冊并獲取一個登記消息的消息標記
UINT?RegisterWindowMessage(LPCTSTR)
說明:
通過?API?函數(shù)來注冊消息標記,其中?LPCTSTR?為用戶的任意字符串。例如:
UINT?WM_MYMSG=RegisterWindowMessage("MYMSG");
其中?WM_MYMSG?是自定義無符號整型的消息標記。

②、在消息映射表中加入消息映射宏
BEGIN_MESSAGE_MAP()

ON_REGISTERED_MESSAGE(WM_MYMSG,fn)
END_MESSAGE_MAP()
說明:
其對應的宏為?ON_REGISTERED_MESSAGE(),其成員函數(shù)的原型為:
afx_msg?LRESULT?fn(WPARAM,LPARAM)
注意:登記消息可以實現(xiàn)跨進程的數(shù)據(jù)通訊。

7、線程消息
只有繼承自CWinThread類才能允許處理線程消息。
①、定義線程的消息標記
有兩種方法:
(1)、使用自定義的消息標記,即:WM_USER;
(2)、使用登記的消息標記,即:RegisterWindowMessage;

②、在CWinThread繼承類的消息映射表中添加宏
ON_THREAD_MESSAGE(消息標記,fn)?//自定義的消息;
ON_REGISTERED_THREAD_MESSAGE(消息標記,fn)?//登記的?//消息
③、其函數(shù)的原型如下:
afx_msg?void?fn(WPARAM?wPARAM,LPARAM?lParam)

④、引發(fā)線程消息
線程消息的引發(fā)必須調(diào)用?CWinThread?類的PostThreadMessage將消息投遞到線程消息隊列中。
注意:可以通過?AfxGetApp()?函數(shù)獲取一個全局的應用對象。
PostThreadMessage(UINT,WPARAM,LPARAM)

8、WM_COPYDATA
操作系統(tǒng)維護一塊內(nèi)存來管理?WM_COPYDATA?消息,該消息主要用于跨進程傳遞數(shù)據(jù),傳遞的數(shù)據(jù)量達到?232。
①、定義一個?COPYDATASTRUCT?數(shù)據(jù)結(jié)構(gòu)
typedef?struct?tagCOPYDATASTRUCT?{?
DWORD?dwData;?//自定義的特殊數(shù)據(jù);
DWORD?cbData;?//以字節(jié)為單位的?lpData?的大?。?
PVOID?lpData;?//傳送的數(shù)據(jù)內(nèi)存塊的指針;
}?COPYDATASTRUCT;?

②、其所對應的宏
ON_WM_COPYDATA()

③、其所對應的函數(shù)的原型
afx_msg?BOOL?OnCopyData(CWnd*,COPYDATASTRUCT*)
說明:
CWnd*:發(fā)送該消息的窗口的指針;


9、投遞和發(fā)送消息
通過向一個窗體投遞或發(fā)送消息,可以間接地驅(qū)動窗體的消息過程。
投遞(PostMessage):將消息放到線程的消息隊列中,然后不等線程處理該消息就直接返回到調(diào)用方。
發(fā)送(SendMessage):當一個線程向目標線程發(fā)送消息時,該線程要一直等待,直到目標線程處理了該消息為止。
①、投遞消息
BOOL?CWnd∷PostMessage(UINT,WPARAM=0,LPARAM=0)
說明:
CWnd:目標窗口;
該函數(shù)將一條消息放入到應用程序的消息隊列,然后不等窗口處理就直接返回。

②、發(fā)送消息
LRESULT?CWnd∷SendMessage(UINT,WPARAM=0,LPARAM=0)
說明:
CWnd:目標窗口;
該函數(shù)將一條消息放入到應用程序的消息隊列,等待窗口處理后才返回。
為了避免線程陷入永久等待狀態(tài),可以用SendMessageTimeout代替SendMessage:
LRESULT?SendMessageTimeout(HWND,UINT,WPARAM,LPARAM,UINT,UINT,PDWORD_PTR)
說明:
HWND:窗口句柄;
UINT:消息發(fā)送的選項,為SMTO_BLOCK時,可以防止線程無?限等待,即根據(jù)一定的超時值返回。
UINT:超時,以毫秒為單位;
PDWORD_PTR:返回值;
注意:CWnd沒有對該函數(shù)的包裝。

③、投遞和發(fā)送消息
BOOL?CWnd∷SendNotifyMessage(UINT,WPARAM,LPARAM)
說明:
CWnd:目標窗口;
該消息具有SendMessage和PostMessage兩種功能:
當目標窗口和發(fā)送窗口為同一個線程時,則相當于SendMessage的功能;否則當不為同一個線程時,則為PostMessage的功能。

6-1、投遞和發(fā)送?WM_XXX?消息
在發(fā)送標準的?WINDOW?消息時,只要將該消息的?ID、wParam、lParam參數(shù)放在?SendMessage()和PostMessage()函數(shù)的相應位置即可。

6-2、投遞和發(fā)送命令消息和控件的通知消息
在投遞和發(fā)送命令消息時,消息的?ID為?WM_COMMADN,而對于不同的菜單項、加速鍵、控件則wParam、lParam的取值不同。
wParam分成低、高兩部分,

低部分為菜單項、加速鍵、控件的ID。 高部分則: 菜單項:0;加速鍵:1;控件:通知碼
lParam:當控件時是控件的句柄,否則為?NULL。

對于wParam參數(shù)可以采用自定義宏:
WPARAM?MAKEWPARAM(WORD?wLow,WORD?wHigh) SendMessage (?WM_COMMAND, MAKEWPARAM (GetDlgCtrlID (), BN_CLICKED),?(LPARAM) m_hWnd);

6-3、投遞和發(fā)送自定義的窗口消息
在投遞和發(fā)送自定義的窗口消息時,參數(shù)?wParam、lParam?沒有特別的涵義,只和普通函數(shù)的形參一樣進行數(shù)據(jù)的傳遞。
注意:
PostMessage?和?SendMessage?是不同的,前者投遞后就返回,而后者必須等到消息處理后再返回;所以在參數(shù)是?[局部]?或?[臨時]時,使用PostMessage函數(shù)會引發(fā)錯誤(除非參數(shù)使用?指針,則可避免錯誤),而必須使用SendMessage函數(shù)。
6-4、投遞和發(fā)送注冊的窗口消息
和?6-3?基本一樣,但它要特別注意的問題是:在跨進程的處理消息時,如果將消息PostMessage、SendMessage到某個進程?A,則必須在進程?B?中獲取進程?A?的窗口類名,并通過窗口類名獲取窗口的指針,最后再根據(jù)指針調(diào)用?PostMessage、SendMessage?函數(shù)。
注意:在獲取窗口的指針時,可以根據(jù)窗口類名或窗口的標題。


6-5、投遞和發(fā)送WM_COPYDATA消息
SendMessage(消息標記,WPARAM,LPARAM)
其中:
消息標記:WM_COPYDATA;
WPARAM:發(fā)送該消息的窗口句柄;
LPARAM:COPYDATASTRUCT結(jié)構(gòu)的指針,先通過(LPVOID)進行轉(zhuǎn)換,再通過(LPARAM)進行轉(zhuǎn)換,如下形式:
(LPARAM)(LPVOID)&cds

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉