现在的位置: 首页 > 综合 > 正文

MFC的自定义消息(用户消息)的定义与使用

2013年08月17日 ⁄ 综合 ⁄ 共 1114字 ⁄ 字号 评论关闭

[转自: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);

          

抱歉!评论已关闭.