資源描述:
《vc_添加自定義消息及消息處理函數(shù)分5步及詳解》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、1.在要添加消息的類頭文件中定義宏?#defineWM_xxxWM_USER+n(n>=0);2.在類的聲明中添加消息處理函數(shù)的聲明?afx_msgvoidxxxx(WPARAMwParam,LPARAMlParam);3.在類的實現(xiàn)文件中消息映射部分添加消息映射??ON_MESSAGE(WM_xxx,xxxx);4.自己編寫消息處理函數(shù)。5.在要發(fā)送此消息的函數(shù)中調(diào)用函數(shù)BOOLPostMessage(?HWNDhWnd,?????//handleofdestinationwindow?UINTMsg,??????//messagetopost?W
2、PARAMwParam,?//firstmessageparameter?LPARAMlParam??//secondmessageparameter);把消息送到消息隊列中。最近在用VC2008做開發(fā),后來由于要用到消息的發(fā)送,而且需要自定義消息,在網(wǎng)上查找了很多例子,根據(jù)他們所說的,雖然大致都差不多,但是基本上沒有一個能完全做出來的。要知道VC編程有一個小地方出錯,都可能是個讓你頭暈?zāi)X脹的事情。經(jīng)過我后來不但探索,經(jīng)過改進之后,一點錯誤都沒有,現(xiàn)在貼出來供大家參考。??????1.先來個基本知識介紹SendMessage的基本結(jié)構(gòu)如下:SendM
3、essage(????HWNDhWnd,??//消息傳遞的目標窗口或線程的句柄。????UINTMsg,?//消息類別(這里可以是一些系統(tǒng)消息,也可以是自己定義,下文具體介紹,)????WPARAMwParam,//參數(shù)1(WPARAM其實是與UINT是同種類型的,??//在vc編譯器中右鍵有個“轉(zhuǎn)到WPARAM的定義”的選項可以查看。????LPARAMlParam);//參數(shù)2其中一些參數(shù)的由來如下://typedefunsignedintUINT;//typedefUINTWPARAM;//typedefLONGLPARAM;//typedef
4、LONGLRESULT;2.??SendMessage用法實例????例如可以用以下語句:voidCTScrollWinView::OnLButtonDblClk(UINTnFlags,CPointpoint)???????{????????????//TODO:在此添加消息處理程序代碼和/或調(diào)用默認值?????::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CHILDFRAMEDBCLK,0,0);?????CScrollView::OnLButtonDblClk(nFlags,point);???????}這是我
5、用VC2008下建立的一個多文檔選項卡式工程里面的一段代碼,是為了實現(xiàn)在子窗口雙擊后發(fā)送一個不帶參數(shù)的消息(其ID為WM_USER+1)給主窗口,如上為部分代碼,其中WM_CHILDFRAMEDBCLK是自定義的消息ID,AfxGetMainWnd()->m_hWnd是獲得主窗口(這里不能使用GetParent()->m_hWnd或者GetParentFrame()->m_hWnd,因為這是獲得父窗口,但父窗口不一定是主窗口,一定要注意,不然消息就會發(fā)錯導致接收不到,我這里卡了半天,后來在QQ群里一位大俠告訴我的,在此再感謝一下那位大俠);3.在接收
6、消息的窗體以及線程所在的頭文件里定義:#defineWM_CHILDFRAMEDBCLK?WM_USER+1???//dosomething4.然后接下來定義一個消息需要映射的函數(shù),如下:afx_msgLRESULTOnChlidFrameDBClick(WPARAMwParam,LPARAMlParam);注意格式必須是:兩個參數(shù)必不可少,返回類型一定為LRESULT,網(wǎng)上很多文章都忽略了這兩點,這也是網(wǎng)上文章普遍錯誤的地方。5.添加消息函數(shù)映射????ON_MESSAGE(WM_CHILDFRAMEDBCLK,OnChlidFrameDBClic
7、k)????注意這里必須是ON_MESSAGE,不能使用ON_COMMAND,前者主要針對用戶自定義消息,后者針對WM_COMMAND命令,比如菜單、工具欄等.6.實現(xiàn)消息函數(shù):我們在接收窗體里定義一個這樣的事情(過程),LRESULTCMainFrame::OnChlidFrameDBClick(WPARAMwParam,LPARAMlParam)??????{????????????CancelFullScreenWin();??//這里調(diào)用了一個使子窗口全屏的自寫函數(shù),我就不貼出來了,以后專題將的時候會提到??????return0;?????
8、?}?7.下面是部分代碼,要想搞清楚自定義消息發(fā)送只看這部分代碼就足夠了在MainFrm.h頭文件里定義了消