版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、在MFC中添加用戶自定義消息首先弄清楚兩點(diǎn):(1)誰(shuí)要發(fā)送這個(gè)消息(2)誰(shuí)要接受這個(gè)消息。用一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明。對(duì)象A向B(也可以就是A到A)發(fā)送消息。1 發(fā)送消息首先在A的頭文件中定義這個(gè)消息:#define WM_USERMESSAGE WM_USER+30所有自定義消息都是以WM_USER消息為基礎(chǔ)加上一個(gè)任意的自然數(shù)來(lái)表示的。A是向外發(fā)送消息的對(duì)象,因此在A的某個(gè)方法(函數(shù))里就會(huì)調(diào)用用來(lái)發(fā)消 息的函數(shù)B:SendMessage()/B:PostMessage(),因?yàn)槭荁接受消息,因此是如上的形式。2 接受消息對(duì)象接受一個(gè)消息,應(yīng)該有三部分:在頭文件中有該消息的處理函數(shù)的原型;在實(shí)
2、現(xiàn)文件中有接受消息映射的宏; 以及該消息的處理函數(shù)的具體實(shí)現(xiàn)。2.1 頭文件中加上自定義消息的處理函數(shù)原型在DECLARE_MESSAGE_MAP()語(yǔ)句之前,一對(duì)AFX_MSG之間加上如下形式的函數(shù)原型:afx_msg LRESULT OnProcName( WPARAM wParam, LPARAM lParam );對(duì)Win32來(lái)說(shuō),wParam, lParam是傳遞消息最常用的手段。2.2 在實(shí)現(xiàn)文件中加上接受消息映射的宏在cpp文件里,BEGIN_MESSAGE_MAP語(yǔ)句之后,在一對(duì)AFX_MSG_MAP之間,增加 如下形式的代碼:ON_MESSAGE(WM_USERMESSAGE
3、, OnProcName)上面是不用分號(hào)結(jié)尾的。2.3 在實(shí)現(xiàn)文件中給出消息處理函數(shù)的具體實(shí)現(xiàn)。發(fā)信人: Amia (小羊橘子和中南海有緣), 信區(qū): VisualC標(biāo)題: MFC中自由使用自定義消息發(fā)信站: 哈工大紫丁香 (2003年11月26日07:45:34 星期三), 站內(nèi)信件消息映射、循環(huán)機(jī)制是Windows程序運(yùn)行的基本方式。VC+ MFC 中有許多現(xiàn)成的消息句柄,可當(dāng)我們需要完成其它的任務(wù),需要自定義消息,就遇到了一些困難。在MFCClassWizard中不允許添加用戶自定義消息,所以我們必須在程序中添加相應(yīng)代碼,以便可以象處理其它消息一樣處理自定義消息。通常的做法是采取以下步驟
4、:第一步:定義消息。推薦用戶自定義消息至少是WM_USER+100,因?yàn)楹芏嘈驴丶惨褂肳M_USER消息。#define WM_MY_MESSAGE (WM_USER+100)第二步:實(shí)現(xiàn)消息處理函數(shù)。該函數(shù)使用WPRAM和LPARAM參數(shù)并返回LPESULT。LPESULT CMainFrame:OnMyMessage(WPARAM wParam, LPARAM lParam)/ TODO: 處理用戶自定義消息.return 0;第三步:在類頭文件的AFX_MSG塊中說(shuō)明消息處理函數(shù):class CMainFrame:public CMDIFrameWnd./ 一般消息映射函數(shù)prote
5、cted:/ AFX_MSG(CMainFrame)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnTimer(UINT nIDEvent);afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);/AFX_MSGDECLARE_MESSAGE_MAP()第四步:在用戶類的消息塊中,使用ON_MESSAGE宏指令將消息映射到消息處理函數(shù)中。BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)/AFX_MSG_MAP(
6、CMainFrame)ON_WM_CREATE()ON_WM_TIMER()ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)/AFX_MSG_MAPEND_MESSAGE_MAP()如果用戶需要一個(gè)定義整個(gè)系統(tǒng)唯一的消息,可以調(diào)用SDK函數(shù)RegisterWindowMessage定義消息:static UINT WM_MY_MESSAGE=RegisterWindowMessage(User);并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步驟同上。當(dāng)需要使用自定義消息時(shí),可以在相應(yīng)類中的函數(shù)中調(diào)用函數(shù)PostMessa
7、ge或SendMessage發(fā)送消息PoseMessage(WM_MY_MESSAGE,O,O); 如果向其他進(jìn)程發(fā)送消息可通過(guò)如下方法發(fā)送消息:DWORD result;SendMessageTimeout(wnd-m_hWnd, / 目標(biāo)窗口WM_MY_MESSAGE, / 消息0, / WPARAM0, / LPARAMSMTO_ABORTIFHUNG |SMTO_NORMAL,TIMEOUT_INTERVAL,&result);以避免其它進(jìn)程如果被阻塞而造成系統(tǒng)死等狀態(tài)??墒侨绻枰蚱渌?如主框架、子窗口、視類、對(duì)話框、狀態(tài)條、工具條或其他控件等)發(fā)送消息時(shí),上述方法顯得無(wú)能為力,
8、而在編程過(guò)程中往往需要獲取其它類中的某個(gè)識(shí)別信號(hào),MFC框架給我們?cè)斐闪朔N種限制,但是可以通過(guò)獲取某個(gè)類的指針而向這個(gè)類發(fā)送消息,而自定義消息的各種動(dòng)作則在這個(gè)類中定義,這樣就可以自由自在的向其它類發(fā)送消息了。下面舉的例子敘述了向視類和框架類發(fā)送消息的方法:在主框架類中向視類發(fā)送消息:視類中定義消息:ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) /定義消息映射視類定義消息處理函數(shù):/ 消息處理函數(shù)LRESULT CMessageView:OnMyMessage(WPARAM wParam, LPARAM lParam)/ TODO: 處理用戶
9、自定義消息.return 0;/發(fā)送消息的測(cè)試函數(shù)void CMainFrame:OnTest()CView * active = GetActiveView();/獲取當(dāng)前視類指針if(active != NULL)active-PostMessage(WM_MY_MESSAGE,0,0);在其它類中向視類發(fā)送消息:/發(fā)送消息的測(cè)試函數(shù)void CMainFrame:OnTest()CMDIFrameWnd *pFrame;CMDIChildWnd *pChild;CView *pView;/獲取主窗口指針pFrame =(CMDIFrameWnd*)AfxGetApp()-m_pMainW
10、nd;/ 獲取子窗口指針pChild = (CMDIChildWnd *) pFrame-GetActiveFrame();/獲取視類指針pView = pChild-GetActiveView();if(pView != NULL)pView-PostMessage(WM_MY_MESSAGE,0,0);/發(fā)送消息其余步驟同上。在視類中向主框架發(fā)送消息:首先在主框架中定義相關(guān)的消息,方法同上,然后在發(fā)送消息的函數(shù)中添加代碼如下/發(fā)送消息的測(cè)試函數(shù)void CMessageView:OnTest()CFrameWnd * active = GetActiveFrame();/獲取當(dāng)前主窗口框架
11、指針if(active != this)active-PostMessage(WM_MY_MESSAGE,0,0);return 0;在其它類中向不同的類發(fā)送消息可依次方法類推,這樣我們的程序就可以的不受限制向其它類和進(jìn)程發(fā)送消息,而避免了種種意想不到的風(fēng)險(xiǎn)。下面一個(gè)例子程序?yàn)槎辔臋n程序里在一對(duì)話框中向視類發(fā)送消息,詳述了發(fā)送自定義消息的具體過(guò)程。實(shí)現(xiàn)步驟:第一步:在VC+中新建工程Message,所有ClassWizard步驟選項(xiàng)均為缺省,完成。第二步:在主菜單中添加測(cè)試菜單為調(diào)出對(duì)話框,在框架類中建立相應(yīng)函數(shù)OnTest()第三步:在資源中建立對(duì)話框,通過(guò)ClassWizard添加新類Te
12、stDialog,添加測(cè)試按鈕,在對(duì)話框類中建立相應(yīng)函數(shù)OnDialogTest()/通過(guò)對(duì)話框按鈕發(fā)送消息的函數(shù)void TestDialog:OnDialogTest()CMDIFrameWnd *pFrame;CMDIChildWnd *pChild;CView *pView;/獲取主窗口指針pFrame =(CMDIFrameWnd*)AfxGetApp()-m_pMainWnd;/ 獲取子窗口指針pChild = (CMDIChildWnd *) pFrame-GetActiveFrame();/獲取視類指針pView = pChild-GetActiveView();if(acti
13、ve != NULL)active-PostMessage(WM_MY_MESSAGE,0,0);/發(fā)送消息在Message.h頭文件中添加如下語(yǔ)句:static UINT WM_MY_MESSAGE=RegisterWindowMessage(Message);第四步:在視類中添加自定義消息:在頭文件MessageView.h中添加消息映射protected:/AFX_MSG(CMessageView)/AFX_MSGafx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); /此行為添加代碼DECLARE_MESSAGE_MAP()
14、在視類文件MessageView.cpp中的消息映射中添加自定義消息映射BEGIN_MESSAGE_MAP(CMessageView, CView)/AFX_MSG_MAP(CMessageView)/AFX_MSG_MAP/ Standard printing commandsON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) /此行添加代碼定義唯一消息END_MESSAGE_MAP()添加相應(yīng)的0消息處理函數(shù)LRESULT CMessageView:OnMyMessage(WPARAM wParam, LPARAM lParam)CRect r
15、ect;GetClientRect(&rect);InvalidateRect(&rect);test=!test;return 0;在MessageView.h中添加布爾變量 public:BOOL test;在視類構(gòu)造函數(shù)中初始化 test變量:test=FALSE;修改CMessageView:OnDraw()函數(shù)void CMessageView:OnDraw(CDC* pDC)CMessageDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ 以下程序顯示消息響應(yīng)效果if(test)pDC-TextOut(0,0,消息響應(yīng)!);第五步:顯示測(cè)
16、試對(duì)話框在MainFrame類中包含對(duì)話框頭文件:#include TestDialog.h;OnTest()函數(shù)中添加代碼void CMainFrame:OnTest()TestDialog dialog;dialog.DoModal();運(yùn)行程序,在測(cè)試菜單打開(kāi)對(duì)話框,點(diǎn)擊測(cè)試按鈕即可看到結(jié)果。關(guān)于VC+中兩種自定義消息的發(fā)送與接收的方法實(shí)現(xiàn)進(jìn)行說(shuō)明說(shuō)明:以下用一個(gè)自創(chuàng)的對(duì)話框類(MyMessageDlg)向視圖類(MessageTestView)發(fā)送自定義消息為例,說(shuō)明這兩種不同方法的自定義消息的總結(jié):消息傳遞的方法一:使用ON_MESSAGE使用ON_MESSAGE響應(yīng)消息,必須配合定
17、義消息#define WM_MY_MESSAGE (WM_USER+100)對(duì)于發(fā)送消息者-MyMessageDlg,在其MyMessageDlg.h中,定義#define WM_MY_MESSAGE (WM_USER+100)在其MyMessageDlg.cpp中要先添加:#include MainFrm.h因?yàn)槭褂昧薈MainFrame*定義對(duì)象。并且要有測(cè)試消息的函數(shù):void MyMessageDlg:OnButtonMsg() / TODO: Add your control notification handler code here CMainFrame* pMF=(CMainF
18、rame*)AfxGetApp()-m_pMainWnd; /先通過(guò)獲取當(dāng)前框架指針 CView * active = pMF-GetActiveView();/才能獲取當(dāng)前視類指針 if(active != NULL) /獲取了當(dāng)前視類指針才能發(fā)送消息 active-PostMessage(WM_MY_MESSAGE,0,0); /使用PostMessage發(fā)送消息對(duì)于消息的接受者-MessageTestView,在其MessageTestView.h中,也要定義#define WM_MY_MESSAGE (WM_USER+100)并定義消息映射函數(shù)-OnMyMessage()protect
19、ed:/AFX_MSG(CMessageTestView)afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); /AFX_MSGDECLARE_MESSAGE_MAP()在其MessageTestView.cpp中,先要聲明響應(yīng)消息:BEGIN_MESSAGE_MAP(CMessageTestView, CEditView)/AFX_MSG_MAP(CMessageTestView)ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)/AFX_MSG_MAP再添加消息響應(yīng)的函數(shù)實(shí)現(xiàn):LRESULT CMes
20、sageTestView:OnMyMessage(WPARAM wParam, LPARAM lParam)MessageBox(OnMyMessage!);return 0; 消息傳遞的方法二:使用ON_REGISTERED_MESSAGE使用ON_REGISTERED_MESSAGE注冊(cè)消息,必須配合static UINT WM_MY_MESSAGE=RegisterWindowMessage(Message);對(duì)于消息的發(fā)送者-MyMessageDlg,在其MyMessageDlg.h中,只要定義static UINT WM_MY_MESSAGE=RegisterWindowMessag
21、e(Message);就可以了。在其MyMessageDlg.cpp中要先添加:#include MainFrm.h因?yàn)槭褂昧薈MainFrame*定義對(duì)象。并且要有測(cè)試消息的函數(shù):void MyMessageDlg:OnButtonMsg() / TODO: Add your control notification handler code here CMainFrame* pMF=(CMainFrame*)AfxGetApp()-m_pMainWnd; /先通過(guò)獲取當(dāng)前框架指針 CView * active = pMF-GetActiveView();/才能獲取當(dāng)前視類指針 if(act
22、ive != NULL) /獲取了當(dāng)前視類指針才能發(fā)送消息 active-PostMessage(WM_MY_MESSAGE,0,0); /使用PostMessage發(fā)送消息對(duì)于消息的接收者-MessageTestView,在其MessageTestView.h中不要定義static UINT WM_MY_MESSAGE=RegisterWindowMessage(Message);應(yīng)該把這個(gè)定義放到MessageTestView.cpp中,要不會(huì)出現(xiàn): redefinition在其MessageTestView.h中只要定義消息映射函數(shù)protected:/AFX_MSG(CMessageT
23、estView)afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); /AFX_MSGDECLARE_MESSAGE_MAP()在其MessageTestView.cpp中,先定義static UINT WM_MY_MESSAGE=RegisterWindowMessage(Message);接著注冊(cè)消息:BEGIN_MESSAGE_MAP(CMessageTestView, CEditView)/AFX_MSG_MAP(CMessageTestView) ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,O
24、nMyMessage)/AFX_MSG_MAP最后添加消息響應(yīng)的函數(shù)實(shí)現(xiàn):LRESULT CMessageTestView:OnMyMessage(WPARAM wParam, LPARAM lParam)MessageBox(OnMyMessage!);return 0;-比較兩種方法,只是略有不同。但也要小心謹(jǐn)慎,以免出現(xiàn)接收不到消息的情況。 -其他注意事項(xiàng):發(fā)送消息的-MyMessageDlg.cpp前也要定義static UINT WM_MY_MESSAGE=RegisterWindowMessage(Message);接受消息的-MessageTestView.cpp前也要定義sta
25、tic UINT WM_MY_MESSAGE=RegisterWindowMessage(Message);RegisterWindowMessage(Message)中的內(nèi)容是什么不重要,寫什么都可以,單必須發(fā)送者與接受者是一樣的內(nèi)容,例如:MessageMFC 消息類型1、命令消息(WM_COMMAND) 所有派生自CCmdTarget的類都有資格接受WM_COMMAND。2、Window消息(WM_xxx) 所有派生自CWnd的類都有資格接受WM_xxx。 3、控件消息(WM_NOTIFY) 控件向其父窗口通知消息。消息處理 1、WM_xxx消息處理窗口類(自身)處理基類處理CWndDe
26、fWindowProc()處理; 其所對(duì)應(yīng)的宏一般為在消息WM_前面加上ON_。 2、命令消息處理 命令消息來(lái)自命令用戶接口對(duì)象(菜單、加速鍵或工具欄按鈕)發(fā)出的WM_COMMAND消息; 、WM_COMMAND消息 其所包含的類型和對(duì)應(yīng)的宏如下: 、ON_COMMAND(ID,pfn) 標(biāo)準(zhǔn)的命令消息; 、ON_COMMAND_EX(ID,pfn) 多個(gè)對(duì)象對(duì)同一個(gè)命令I(lǐng)D的處理; 其函數(shù)的原型如下: afx_msgBOOLpfn(UINTnID) 說(shuō)明: 當(dāng)返回TRUE時(shí)表示已經(jīng)處理,不用在消息處理鏈中繼續(xù)處理該命令;為FALSE時(shí)表示繼續(xù)在消息處理鏈中處理該命令。 注意: 其一:在多對(duì)象
27、處理中一定要使用該宏; 其二:pfn(UINTnID)(消息處理函數(shù))返回值將其類型void改成BOOL,而且必須為FALSE; 其三:多個(gè)對(duì)象的處理是由高層向低層的過(guò)程:即視圖類主框架窗口類應(yīng)用程序類; 、ON_COMMAND_RANGE(nID,nLastID,pfn) 多個(gè)命令I(lǐng)D提供相同的處理; 注意: 其一:確保nID、nLastID的值在Resource.h中是連續(xù)的。 其二:一般在函數(shù)pfn(UINTnID)中加入?yún)?shù),用來(lái)確定那一個(gè)按鈕點(diǎn)擊。 、CN_UPDATE_COMMAND_UI消息 當(dāng)菜單項(xiàng)、工具欄按鈕等命令用戶接口對(duì)象要更新其狀態(tài)時(shí)所對(duì)應(yīng)的消息,它所包含的類型和對(duì)應(yīng)的
28、宏如下: 、ON_UPDATE_COMMAND_UI(ID,pfn) 其中函數(shù)的原型如下:afx_msgvoidpfn(CCmdUI*pCmdUI) 、ON_UPDATE_COMMAND_UI_RANGE(nID,nLastID,pfn) 該函數(shù)可以處理一組命令用戶接口對(duì)象的外觀; 其中函數(shù)的原型如下:afx_msgvoidpfn(CCmdUI*pCmdUI) 重要: CCmdUI中的m_nID成員表示不同的ID,因此可以利用它來(lái)進(jìn)行區(qū)別處理。3、控件的通知消息 從控件和子窗口發(fā)送到父窗口的WM_COMMAND通知消息(即在發(fā)送命令消息中加入控件的通知碼)。 注意:在Window9x新控件中不
29、再傳送WM_COMMAND通知消息,而是發(fā)送WM_NOTIFY消息,但為了兼容,舊有的控件還是傳送WM_COMMAND消息。 例如: CEdit控件向父窗口發(fā)送EN_CHANGE通知代碼的WM_COMMAND消息。注意:框架像傳送其它WM_消息一樣傳送通知消息,但有一個(gè)例外,即由按鈕控件發(fā)送的BN_CLICKED通知消息,被作為命令消息特別處理。 、WM_COMMAND其所對(duì)應(yīng)的宏如下: 、ON_CONTROL(通知碼,nID,fn) 、ON_CONTROL_RANGE(通知碼,nFirstID,nEndID,fn) 注意: 這兩個(gè)宏的應(yīng)用和ON_COMMAND、ON_COMMAND_RANG
30、E相同,所不同的是在宏前面加入通知碼。 注意:可以根據(jù)不同的控件的通知碼派生出特定的宏,其所派生的宏一般為在通知碼前面加上ON_。 、WM_NOTIFY其所對(duì)應(yīng)的宏如下: 、ON_NOTIFY(通知碼,nID,fn) 其中函數(shù)的原型如下: afx_msgvoidfn(NMHDR*pNotifyStruct,LRESULT*result) 其中結(jié)構(gòu): typedefstructtagNMHDR HWNDhwndFrom;/發(fā)送通知消息的控件的句柄; UINTidFrom;/發(fā)送通知消息的控件的ID; UINTcode;/通知碼; NMHDR; 、ON_NOTIFY_EX(通知碼,nID,fn)
31、表示一個(gè)消息在多個(gè)對(duì)象的成員函數(shù)中進(jìn)行處理。 其中函數(shù)的原型如下: afx_msgBOOLfn(UINTnID,NMHDR*pNotifyStruct,LRESULT*result) 說(shuō)明: 它必須返回BOOL類型的數(shù)值,其意義和ON_COMMAND_EX相同。 、ON_NOTIFY_RANGE(通知碼,nFirstID,nEnd,fn) 表示多個(gè)控件的通知消息在同一個(gè)函數(shù)中進(jìn)行處理。 其中函數(shù)的原型如下: afx_msgvoidfn(UINTnID,NMHDR*pNotifyStruct,LRESULT*result) 說(shuō)明: 其意義和ON_COMMAND_RANGE相同。 4、反射消息處理
32、 父窗口在處理控件窗口的通知消息WM_CTLCOLOR、WM_COMMAND、WM_NOTIFY時(shí),會(huì)把該消息轉(zhuǎn)化為反射消息,并轉(zhuǎn)交給控件子窗口處理,只有在控件子窗體不處理該消息時(shí),父窗口才有機(jī)會(huì)處理。 注意:在類的屬性對(duì)話框中的消息頁(yè)面可查反射消息(前面有=標(biāo)志) 、WM_CTLCOLOR_REFLECT反射消息 其所對(duì)應(yīng)的宏如下: ON_WM_CTLCOLOR_REFLECT() 反射消息函數(shù)的原型: HBRUSHclass_nameCtlColor(CDC*pDC,UINTnCtlColor) returnNULL; 該函數(shù)用來(lái)重置控件的顔色;注意:必須returnCBrush才有效。
33、5、自定義的窗口消息 自定義窗口消息的消息標(biāo)志都大于WM_USER(至少是WM_USER+100,因?yàn)樵S多控件都使用這一范圍的WM_USER消息) 使用自定義的消息分為二步: 、在Resource.h中定義消息標(biāo)記 #defineWM_MYMSG (WM_USER+1000) 、在消息映射表中加入消息映射宏 BEGIN_MESSAGE_MAP() ON_MESSAGE(WM_MYMSG,fn) END_MESSAGE_MAP() 說(shuō)明: 其對(duì)應(yīng)的宏為ON_MESSAGE(),其成員函數(shù)的原型為: afx_msgLRESULTfn(WPARAM,LPARAM) 6、登記消息 、在系統(tǒng)中注冊(cè)并獲取
34、一個(gè)登記消息的消息標(biāo)記 UINTRegisterWindowMessage(LPCTSTR) 說(shuō)明:通過(guò)API函數(shù)來(lái)注冊(cè)消息標(biāo)記,其中LPCTSTR為用戶的任意字符串。例如: UINTWM_MYMSG=RegisterWindowMessage(MYMSG);其中WM_MYMSG是自定義無(wú)符號(hào)整型的消息標(biāo)記。 、在消息映射表中加入消息映射宏 BEGIN_MESSAGE_MAP() ON_REGISTERED_MESSAGE(WM_MYMSG,fn) END_MESSAGE_MAP() 說(shuō)明:其對(duì)應(yīng)的宏為ON_REGISTERED_MESSAGE(),其成員函數(shù)的原型為: afx_msgLRES
35、ULTfn(WPARAM,LPARAM) 注意:登記消息可以實(shí)現(xiàn)跨進(jìn)程的數(shù)據(jù)通訊。 7、線程消息 只有繼承自CWinThread類才能允許處理線程消息。 、定義線程的消息標(biāo)記 有兩種方法: (1)、使用自定義的消息標(biāo)記,即:WM_USER; (2)、使用登記的消息標(biāo)記,即:RegisterWindowMessage; 、在CWinThread繼承類的消息映射表中添加宏 ON_THREAD_MESSAGE(消息標(biāo)記,fn)/自定義的消息; ON_REGISTERED_THREAD_MESSAGE(消息標(biāo)記,fn)/登記的/消息 、其函數(shù)的原型如下: afx_msgvoidfn(WPARAMwPA
36、RAM,LPARAMlParam) 、引發(fā)線程消息 線程消息的引發(fā)必須調(diào)用CWinThread類的PostThreadMessage將消息投遞到線程消息隊(duì)列中。注意:可以通過(guò)AfxGetApp()函數(shù)獲取一個(gè)全局的應(yīng)用對(duì)象。PostThreadMessage(UINT,WPARAM,LPARAM) 8、WM_COPYDATA 操作系統(tǒng)維護(hù)一塊內(nèi)存來(lái)管理WM_COPYDATA消息,該消息主要用于跨進(jìn)程傳遞數(shù)據(jù),傳遞的數(shù)據(jù)量達(dá)到232。 、定義一個(gè)COPYDATASTRUCT數(shù)據(jù)結(jié)構(gòu) typedefstructtagCOPYDATASTRUCT DWORDdwData;/自定義的特殊數(shù)據(jù); DWO
37、RDcbData;/以字節(jié)為單位的lpData的大小; PVOIDlpData;/傳送的數(shù)據(jù)內(nèi)存塊的指針; COPYDATASTRUCT; 、其所對(duì)應(yīng)的宏 ON_WM_COPYDATA() 、其所對(duì)應(yīng)的函數(shù)的原型 afx_msgBOOLOnCopyData(CWnd*,COPYDATASTRUCT*) 說(shuō)明:CWnd*:發(fā)送該消息的窗口的指針; 9、投遞和發(fā)送消息 通過(guò)向一個(gè)窗體投遞或發(fā)送消息,可以間接地驅(qū)動(dòng)窗體的消息過(guò)程。 投遞(PostMessage):將消息放到線程的消息隊(duì)列中,然后不等線程處理該消息就直接返回到調(diào)用方。 發(fā)送(SendMessage):當(dāng)一個(gè)線程向目標(biāo)線程發(fā)送消息時(shí),該
38、線程要一直等待,直到目標(biāo)線程處理了該消息為止。 、投遞消息 BOOLCWndPostMessage(UINT,WPARAM=0,LPARAM=0) 說(shuō)明:CWnd:目標(biāo)窗口; 該函數(shù)將一條消息放入到應(yīng)用程序的消息隊(duì)列,然后不等窗口處理就直接返回。 、發(fā)送消息 LRESULTCWndSendMessage(UINT,WPARAM=0,LPARAM=0) 說(shuō)明:CWnd:目標(biāo)窗口; 該函數(shù)將一條消息放入到應(yīng)用程序的消息隊(duì)列,等待窗口處理后才返回。 為了避免線程陷入永久等待狀態(tài),可以用SendMessageTimeout代替SendMessage: LRESULTSendMessageTimeout
39、(HWND,UINT,WPARAM,LPARAM,UINT,UINT,PDWORD_PTR) 說(shuō)明:HWND:窗口句柄; UINT:消息發(fā)送的選項(xiàng),為SMTO_BLOCK時(shí),可以防止線程無(wú)限等待,即根據(jù)一定的超時(shí)值返回。 UINT:超時(shí),以毫秒為單位; PDWORD_PTR:返回值; 注意:CWnd沒(méi)有對(duì)該函數(shù)的包裝。 、投遞和發(fā)送消息 BOOLCWndSendNotifyMessage(UINT,WPARAM,LPARAM) 說(shuō)明:CWnd:目標(biāo)窗口; 該消息具有SendMessage和PostMessage兩種功能: 當(dāng)目標(biāo)窗口和發(fā)送窗口為同一個(gè)線程時(shí),則相當(dāng)于SendMessage的功能
40、;否則當(dāng)不為同一個(gè)線程時(shí),則為PostMessage的功能。 6-1、投遞和發(fā)送WM_XXX消息 在發(fā)送標(biāo)準(zhǔn)的WINDOW消息時(shí),只要將該消息的ID、wParam、lParam參數(shù)放在SendMessage()和PostMessage()函數(shù)的相應(yīng)位置即可。 6-2、投遞和發(fā)送命令消息和控件的通知消息 在投遞和發(fā)送命令消息時(shí),消息的ID為WM_COMMADN,而對(duì)于不同的菜單項(xiàng)、加速鍵、控件則wParam、lParam的取值不同。 wParam分成低、高兩部分,低部分為菜單項(xiàng)、加速鍵、控件的ID。高部分則: 菜單項(xiàng):0;加速鍵:1;控件:通知碼 lParam:當(dāng)控件時(shí)是控件的句柄,否則為NUL
41、L。 對(duì)于wParam參數(shù)可以采用自定義宏: WPARAMMAKEWPARAM(WORDwLow,WORDwHigh) 6-3、投遞和發(fā)送自定義的窗口消息 在投遞和發(fā)送自定義的窗口消息時(shí),參數(shù)wParam、lParam沒(méi)有特別的涵義,只和普通函數(shù)的形參一樣進(jìn)行數(shù)據(jù)的傳遞。 注意:PostMessage和SendMessage是不同的,前者投遞后就返回,而后者必須等到消息處理后再返回;所以在參數(shù)是局部或臨時(shí)時(shí),使用PostMessage函數(shù)會(huì)引發(fā)錯(cuò)誤(除非參數(shù)使用指針,則可避免錯(cuò)誤),而必須使用SendMessage函數(shù)。 6-4、投遞和發(fā)送注冊(cè)的窗口消息 和6-3基本一樣,但它要特別注意的問(wèn)題
42、是:在跨進(jìn)程的處理消息時(shí),如果將消息PostMessage、SendMessage到某個(gè)進(jìn)程A,則必須在進(jìn)程B中獲取進(jìn)程A的窗口類名,并通過(guò)窗口類名獲取窗口的指針,最后再根據(jù)指針調(diào)用PostMessage、SendMessage函數(shù)。 注意:在獲取窗口的指針時(shí),可以根據(jù)窗口類名或窗口的標(biāo)題。 6-5、投遞和發(fā)送WM_COPYDATA消息 SendMessage(消息標(biāo)記,WPARAM,LPARAM) 其中:消息標(biāo)記:WM_COPYDATA; WPARAM:發(fā)送該消息的窗口句柄; LPARAM:COPYDATASTRUCT結(jié)構(gòu)的指針,先通過(guò)(LPVOID)進(jìn)行轉(zhuǎn)換,再通過(guò)(LPARAM)進(jìn)行轉(zhuǎn)換
43、,如下形式: (LPARAM)(LPVOID)&cdsSendMessage消息參數(shù)大全SENDMESSAGE 參數(shù):WM_CREATE = &H0001 應(yīng)用程序創(chuàng)建一個(gè)窗口 WM_DESTROY = &H0002 一個(gè)窗口被銷毀 WM_MOVE = &H0003 移動(dòng)一個(gè)窗口 WM_SIZE = &H0005 改變一個(gè)窗口的大小 WM_ACTIVATE = &H0006 一個(gè)窗口被激活或失去激活狀態(tài); WM_SETFOCUS = &H0007 獲得焦點(diǎn)后 WM_KILLFOCUS = &H0008 失去焦點(diǎn) WM_ENABLE = &H000A 改變enable狀態(tài) WM_SETREDRA
44、W = &H000B 設(shè)置窗口是否能重畫 WM_SETTEXT = &H000C 應(yīng)用程序發(fā)送此消息來(lái)設(shè)置一個(gè)窗口的文本 WM_GETTEXT = &H000D 應(yīng)用程序發(fā)送此消息來(lái)復(fù)制對(duì)應(yīng)窗口的文本到緩沖區(qū) WM_GETTEXTLENGTH = &H000E 得到與一個(gè)窗口有關(guān)的文本的長(zhǎng)度(不包含空字符) WM_PAINT = &H000F 要求一個(gè)窗口重畫自己 WM_CLOSE = &H0010 當(dāng)一個(gè)窗口或應(yīng)用程序要關(guān)閉時(shí)發(fā)送一個(gè)信號(hào) WM_QUERYENDSESSION=&H0011 當(dāng)用戶選擇結(jié)束對(duì)話框或程序自己調(diào)用ExitWindows函數(shù) WM_QUIT = &H0012 用來(lái)結(jié)
45、束程序運(yùn)行或當(dāng)程序調(diào)用postquitmessage函數(shù) WM_QUERYOPEN = &H0013 當(dāng)用戶窗口恢復(fù)以前的大小位置時(shí),把此消息發(fā)送給某個(gè)圖標(biāo) WM_ERASEBKGND = &H0014 當(dāng)窗口背景必須被擦除時(shí)(例在窗口改變大小時(shí)) WM_SYSCOLORCHANGE = &H0015 當(dāng)系統(tǒng)顏色改變時(shí),發(fā)送此消息給所有頂級(jí)窗口 WM_ENDSESSION = &H0016 當(dāng)系統(tǒng)進(jìn)程發(fā)出WM_QUERYENDSESSION消息后,此消息發(fā)送給應(yīng)用程序, 通知它對(duì)話是否結(jié)束 WM_SYSTEMERROR = &H0017 WM_SHOWWINDOW = &H0018 當(dāng)隱藏或顯
46、示窗口是發(fā)送此消息給這個(gè)窗口 WM_ACTIVATEAPP = &H001C 發(fā)此消息給應(yīng)用程序哪個(gè)窗口是激活的,哪個(gè)是非激活的; WM_FONTCHANGE = &H001D 當(dāng)系統(tǒng)的字體資源庫(kù)變化時(shí)發(fā)送此消息給所有頂級(jí)窗口 WM_TIMECHANGE = &H001E 當(dāng)系統(tǒng)的時(shí)間變化時(shí)發(fā)送此消息給所有頂級(jí)窗口 WM_CANCELMODE = &H001F 發(fā)送此消息來(lái)取消某種正在進(jìn)行的摸態(tài)(操作) WM_SETCURSOR = &H0020 如果鼠標(biāo)引起光標(biāo)在某個(gè)窗口中移動(dòng)且鼠標(biāo)輸入沒(méi)有被捕獲時(shí),就發(fā)消息給某個(gè)窗口 WM_MOUSEACTIVATE = &H0021 當(dāng)光標(biāo)在某個(gè)非激活的
47、窗口中而用戶正按著鼠標(biāo)的某個(gè)鍵發(fā)送此消息給當(dāng)前窗口 WM_CHILDACTIVATE = &H0022 發(fā)送此消息給MDI子窗口當(dāng)用戶點(diǎn)擊此窗口的標(biāo)題欄,或當(dāng)窗口被激活,移動(dòng),改變大小 WM_QUEUESYNC = &H0023 此消息由基于計(jì)算機(jī)的訓(xùn)練程序發(fā)送,通過(guò)WH_JOURNALPALYBACK的hook程序 分離出用戶輸入消息 WM_GETMINMAXINFO = &H0024 此消息發(fā)送給窗口當(dāng)它將要改變大小或位置; WM_PAINTICON = &H0026 發(fā)送給最小化窗口當(dāng)它圖標(biāo)將要被重畫 WM_ICONERASEBKGND = &H0027 此消息發(fā)送給某個(gè)最小化窗口,僅當(dāng)
48、它在畫圖標(biāo)前它的背景必須被重畫 WM_NEXTDLGCTL = &H0028 發(fā)送此消息給一個(gè)對(duì)話框程序去更改焦點(diǎn)位置 WM_SPOOLERSTATUS = &H002A 每當(dāng)打印管理列隊(duì)增加或減少一條作業(yè)時(shí)發(fā)出此消息 WM_DRAWITEM = &H002B 當(dāng)button,combobox,listbox,menu的可視外觀改變時(shí)發(fā)送 此消息給這些空件的所有者 WM_MEASUREITEM = &H002C 當(dāng)button, combo box, list box, list view control, or menu item 被創(chuàng)建時(shí),發(fā)送此消息給控件的所有者 WM_DELETEITE
49、M = &H002D 當(dāng)the list box 或 combo box 被銷毀 或 當(dāng) 某些項(xiàng)被刪除通過(guò)LB_DELETESTRING, LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT 消息 WM_VKEYTOITEM = &H002E 此消息有一個(gè)LBS_WANTKEYBOARDINPUT風(fēng)格的發(fā)出給它的所有者來(lái)響應(yīng)WM_KEYDOWN消息 WM_CHARTOITEM = &H002F 此消息由一個(gè)LBS_WANTKEYBOARDINPUT風(fēng)格的列表框發(fā)送給他的所有者來(lái)響應(yīng)WM_CHAR消息 WM_SETFONT = &H0030
50、當(dāng)繪制文本時(shí)程序發(fā)送此消息得到控件要用的顏色 WM_GETFONT = &H0031 應(yīng)用程序發(fā)送此消息得到當(dāng)前控件繪制文本的字體 WM_SETHOTKEY = &H0032 應(yīng)用程序發(fā)送此消息讓一個(gè)窗口與一個(gè)熱鍵相關(guān)連 WM_GETHOTKEY = &H0033 應(yīng)用程序發(fā)送此消息來(lái)判斷熱鍵與某個(gè)窗口是否有關(guān)聯(lián) WM_QUERYDRAGICON = &H0037 此消息發(fā)送給最小化窗口,當(dāng)此窗口將要被拖放而它的類中沒(méi)有定義圖標(biāo),應(yīng)用程序能返回一個(gè)圖標(biāo)或光標(biāo)的句柄,當(dāng)用戶拖放圖標(biāo)時(shí)系統(tǒng)顯示這個(gè)圖標(biāo)或光標(biāo) WM_COMPAREITEM = &H0039 發(fā)送此消息來(lái)判定combobox或listbox新增加的項(xiàng)的相對(duì)位置 WM_GETOBJECT = &H003D W
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度自然人與音樂(lè)制作人創(chuàng)作合同3篇
- 二零二五年度出境領(lǐng)隊(duì)培訓(xùn)基地建設(shè)合同4篇
- 2025物業(yè)保潔與緊急維修值班服務(wù)一體化項(xiàng)目合同9篇
- 2025年度智能停車設(shè)施門面房產(chǎn)權(quán)轉(zhuǎn)讓合同4篇
- 2025年度個(gè)人與公司租賃合同糾紛處理?xiàng)l款4篇
- 二零二五年度啤酒品牌市場(chǎng)推廣代理合同3篇
- 二零二五年度城市核心區(qū)存量房買賣居間服務(wù)合同4篇
- 二零二五版智能門窗遠(yuǎn)程監(jiān)控服務(wù)合同范本4篇
- 二零二五年度旅行社旅游紀(jì)念品承包合同3篇
- 2025年度農(nóng)家樂(lè)旅游產(chǎn)品定制開(kāi)發(fā)與銷售合同3篇
- 設(shè)備管理績(jī)效考核細(xì)則
- 中國(guó)人民銀行清算總中心直屬企業(yè)2023年招聘筆試上岸歷年典型考題與考點(diǎn)剖析附帶答案詳解
- (正式版)SJT 11449-2024 集中空調(diào)電子計(jì)費(fèi)信息系統(tǒng)工程技術(shù)規(guī)范
- 廣州綠色金融發(fā)展現(xiàn)狀及對(duì)策的研究
- 人教版四年級(jí)上冊(cè)加減乘除四則混合運(yùn)算300題及答案
- 合成生物學(xué)技術(shù)在生物制藥中的應(yīng)用
- 消化系統(tǒng)疾病的負(fù)性情緒與心理護(hù)理
- 高考語(yǔ)文文學(xué)類閱讀分類訓(xùn)練:戲劇類(含答案)
- 協(xié)會(huì)監(jiān)事會(huì)工作報(bào)告大全(12篇)
- WS-T 813-2023 手術(shù)部位標(biāo)識(shí)標(biāo)準(zhǔn)
- 同意更改小孩名字協(xié)議書(shū)
評(píng)論
0/150
提交評(píng)論