Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=16276
在學(xué)習(xí)<vc6.0技術(shù)內(nèi)幕>過程中遇到要添加用戶自定義消息的過程.我覺得書上寫的比較散,于是就自己總結(jié)了這個(gè)基本過程,以為日后備查.
首先弄清楚兩點(diǎn):(1)誰要發(fā)送這個(gè)消息(2)誰要接受這個(gè)消息。
用一個(gè)簡(jiǎn)單的例子來說明。對(duì)象A向B(也可以就是A到A)發(fā)送消息。
1 發(fā)送消息
首先在A的頭文件中定義這個(gè)消息:
#define WM_USERMESSAGE WM_USER+30
所有自定義消息都是以WM_USER消息為基礎(chǔ)加上一個(gè)任意的自然數(shù)來表示的。A是向外發(fā)送消息的對(duì)象,因此在A的某個(gè)方法(函數(shù))里就會(huì)調(diào)用用來發(fā)消息的函數(shù)B::SendMessage()/B::PostMessage(),因?yàn)槭荁接受消息,因此是如上的形式。
2 接受消息
對(duì)象接受一個(gè)消息,應(yīng)該有三部分:在頭文件中有該消息的處理函數(shù)的原型;在實(shí)現(xiàn)文件中有接受消息映射的宏; 以及該消息的處理函數(shù)的具體實(shí)現(xiàn)。
2.1 頭文件中加上自定義消息的處理函數(shù)原型
在DECLARE_MESSAGE_MAP()語句之前,一對(duì)AFX_MSG之間加上如下形式的函數(shù)原型:
afx_msg LRESULT OnProcName( WPARAM wParam, LPARAM lParam );
對(duì)Win32來說,wParam, lParam是傳遞消息最常用的手段。
2.2 在實(shí)現(xiàn)文件中加上接受消息映射的宏
在cpp文件里,BEGIN_MESSAGE_MAP語句之后,在一對(duì)AFX_MSG_MAP之間,增加 如下形式的代碼:
ON_MESSAGE(WM_USERMESSAGE, OnProcName)
上面是不用分號(hào)結(jié)尾的。
2.3 在實(shí)現(xiàn)文件中給出消息處理函數(shù)的具體實(shí)現(xiàn)。
開始用到自定義消息,找了半個(gè)小時(shí),總結(jié)如下:
1、首先在用戶類中聲明自定義消息WM_SHOWTASK(當(dāng)然可以為其他):
#define WM_SHOWTASK WM_USER + 101
2、然后在類成員聲明中聲明消息處理函數(shù)
afx_msg void MyMessageProc();
3、在類實(shí)現(xiàn)文件中添加消息映射宏
ON_MESSAGE(WM_MyMessage,MyMessageProc);
(如果用戶需要一個(gè)整個(gè)系統(tǒng)唯一的消息,可以調(diào)用 SDK 函數(shù) RegisterWindowMessage 并使用 ON_REGISTER_MESSAGE 宏指令取代 ON_MESSAGE 宏指令,其余步驟同上。)
4、在類實(shí)現(xiàn)文件中添加消息處理函數(shù)
LRESULT CMyDlg::MyMessageProc()
首先定義消息:例如 define WM_MYMESSAGE (WM_USER+100)
在.H文件中,加入消息響應(yīng)函數(shù),如:
LONG OnMyMessage(WPARAM w,LPARAM l);
該函數(shù)有規(guī)定的格式:
LONG Function_Name(WPARAM w,LPARAM l);
加入消息響應(yīng)宏,在響應(yīng)該消息的類中,在消息響應(yīng)塊中,
成為如下樣式:
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
在.CPP文件中,編輯消息響應(yīng)函數(shù),如下:
LONG CMyClass::OnMyMessage(WPARAM w,LPARAM l)
{}