[转自:http://blog.csdn.net/nuptboyzhb/article/details/7354702],略加整理及补充。
自定义消息的响应和资源消息的响应有很多类似之处;资源消息的响应是以资源的ID号作为标识的;自定义的消息要自己声明消息ID。
第一步,声明消息:
#define WM_MYMSG (WM_USER + 100)
第二步,在类声明中声明消息映射:
DECLARE_MESSAGE_MAP()
第三步,在类声明中定义消息处理函数:
afx_msg LRESULT MyMsgHandler(WPARAM,LPARAM);
在.cpp中做的工作:
第四步,实现消息映射:
BEGIN_MESSAGE_MAP()
ON_MESSAGE(WM_MYMSG,OnMyMsgHandler)
END_MESSAGE_MAP()
第五步,要实现消息处理函数(当然可以不实现):
LRESULT CMainFrame::OnMyMsgHandler(WPARAM w, LPARAM l)
{
AfxMessageBox("Hello,World!");
return 0;
}
1. 如果该自定义消息所在的类是有CWnd派生出来的,且在本类中调用,那么我们可以调用CWnd::SendMessage()函数,具体定义为:
LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
此时我们只需要在引发消息的地方添加如下代码:
SendMessge(WM_MYMSG,0,0);
如果我们想在不同的情况下发送用户消息,我们只需要将SendMessage的后两个参数wParam,lParam加以标识即可;在消息处理函数,写一个if条件语句(或switch语 句)就可以了;将不同情况下的用户消息区分开;
2. 如果不在本类中响应自定义消息;那么我们只能用win32 的API函数。
例如,当自定义消息在CMainFrame中,而触发消息的地方不在CMainFrame类中,那么我们可以用如下语句:
::SendMessge(::AfxGetMainWnd()->m_hWnd, WM_MYMSG, 0, 0);
定义消息在地方在活动视图中:
CMainFrame *pMain = (CMainFrame *) AfxGetMainWnd();
pMain->GetActiveView()->PostMessage(WM_MYMSG, 0, 0);