vc中使用SendMessage自定義消息函數(shù)
SendMessage的基本結(jié)構(gòu)如下:
SendMessage( HWND hWnd, //消息傳遞的目標(biāo)窗口或線程的句柄。 UINT Msg, //消息類別(這里可以是一些系統(tǒng)消息,也可以是自己定義,下文具體介紹,) WPARAM wParam, //參數(shù)1 (WPARAM 其實(shí)是與UINT是同種類型的, //在vc編譯器中右鍵有個“轉(zhuǎn)到WPARAM的定義”的選項(xiàng)可以查看。 LPARAM lParam); //參數(shù)2
其中一些參數(shù)的由來如下:
//typedef unsigned int UINT;
//typedef UINT WPARAM;
//typedef LONG LPARAM;
//typedef LONG LRESULT;
例如可以用以下語句:
::SendMessage(this->m_hWnd, WM_MY_DOSOME, (WPARAM) 0, (LPARAM) 0);
這里我發(fā)送的消息是本窗體接收的,所以句柄用:this->m_hWnd
這里的消息類別WM_MY_DOSOME就是我自定義的,
在接收消息的窗體或線程所在的頭文件里:
#define WM_MY_DOSOME WM_USER+1 // do something
當(dāng)然你還可以定義更多如:
#define WM_DOOTHER WM_USER+2 // do other
表示要做一些事情。
到這里,可能大家還是對消息類別有點(diǎn)模糊,不要擔(dān)心,我下面很快就講到。
我們發(fā)了一個消息出去,那么接收方要能識別這個消息是干什么,就是通過消息類別來區(qū)分,
并且開始去做這個消息對應(yīng)要處理的事情。如下:
一:編寫一個事情:
我們在接收窗體里定義一個這樣的事情(過程),
afx_msg LRESULT DoSomeThing(WPARAM iParam1,LPARAM iParam2) { MessageBox("收到消息了,我要開始做一些事情了。","收到",MB_OK); //可以運(yùn)用iParam1,iParam2 來做一些事情。 return 0; }
這個事情有3點(diǎn)大家要注意,非常重要:
1:使用了afx_msg,并且要將afx_msg LRESULT DoSomeThing(WPARAM iParam1,LPARAM iParam2)
改寫到頭文件的
//{{AFX_MSG
//。。。改寫到這里,顏色會變成灰的。這一點(diǎn)非常重要。
//}}AFX_MSG
2:參數(shù)有2個,WPARAM iParam1,LPARAM iParam2,哪怕沒有東西傳進(jìn)來也要寫,不然會吃苦頭的,vc里不會提醒你少寫了一個,
但一些莫名奇妙的事情會發(fā)生。
3:類型用 LRESULT,完了要return 0;
二:讓接收方知道什么時(shí)候做這個事情:
我們在
//{{AFX_MSG_MAP //。。。這里寫上 ON_MESSAGE(WM_MY_DOSOME,DoSomeThing) //如果還有其他消息就再寫一個 ON_MESSAGE(WM_DOOTHER,DoOther) //}}AFX_MSG_MAP
到這里,當(dāng)你用SendMessage,發(fā)了一個WM_MY_DOSOME類型的消息過來的時(shí)候,
接收方就會去做DoSomeThing(WPARAM iParam1,LPARAM iParam2)
發(fā)了一個WM_DOOTHER類型的消息過來的時(shí)候,
接收方就會去做DoOther(WPARAM iParam1,LPARAM iParam2)當(dāng)然,這里DoOther我還沒有定義,
這樣就是一個完整的消息發(fā)送與接受過程,我沒有詳細(xì)講參數(shù),iParam1,因?yàn)檫€沒有用到很復(fù)雜的情況,
大家要是有心得我們可以一起提高。
在頭文件里
#define WM_MYMSG WM_USER+5 //自定義一個消息
afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam); //自定義消息的處理函數(shù)聲明
在.cpp文件里
ON_MESSAGE(WM_MYMSG, OnMyMessage)
//利用ON_MESSAGE()宏在自定義消息與其處理函數(shù)間建立映射關(guān)系
void CModelessDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
//從lParam中取出CString對象的指針,并將字符串內(nèi)容在IDC_MSGEDIT中顯示出來
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
相關(guān)文章
C語言實(shí)現(xiàn)賓館管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)賓館管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03QT實(shí)現(xiàn)QML側(cè)邊導(dǎo)航欄的最簡方法
本文主要介紹了QT實(shí)現(xiàn)QML側(cè)邊導(dǎo)航欄的最簡方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06一道超經(jīng)典的C++結(jié)構(gòu)體的題目
以下小編就為大家介紹一道超經(jīng)典的關(guān)于C++結(jié)構(gòu)體的題目。需要的朋友可以過來參考下2013-09-09C++使用string的大數(shù)除法運(yùn)算(4)
這篇文章主要為大家詳細(xì)介紹了C++使用string的大數(shù)除法運(yùn)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09