ON_MESSAGE的使用(转)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Date: 20180815

msdn:https://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=ZH-CN&k=k(ON_MESSAGE);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true

ON_MESSAGE(message, memberFxn)

指定哪一个函数用来处理这个用户定义消息;

头文件:  afxmsg_.h

参数:  

message      消息ID,这里指的是用户定义消息的ID

memberFxn     消息映射消息处理函数的名称;

          函数的类型必须是:  afx_msg LRESULT (CWnd::*)(WPARAM, LPARAM);

备注:

  用户定义消息不属于任何一种标准Windows WM_MESSAGE消息。当选择消息标识时,必须使用某一范围的值:WM_USER(0x0400)到0x7FFF或WM_APP(0x8000)到0xBFFF。

  对于每一个用户定义消息,在message map中必须要有一个ON_MESSAGE宏定义语句来映射到一个消息处理函数。

注意:除了用户定义消息外,ON_MESSAGE还处理较为不常见的Windows消息。


定义:

// 头文件中宏定义用户定义消息:
#define
WM_MYMESSAGE (WM_USER + 100)
// 源文件中进行用户定义消息注册
BEGIN_MESSAGE_MAP(CMyWnd2, CWnd) ON_MESSAGE(WM_MYMESSGAE, OnMyMessage) END_MESSAGE_MAP()
// 头文件中进行用户定义消息响应函数的声明
//
inside the CMyWnd2 class declaration afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
// 源文件中进行用户定义消息响应函数的实现
LRESULT CMyWnd2::OnMyMessage(WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(lParam);
// Handle message here. return 0; }

怎么使用呢?

1. 如果用户定义消息所在的类是由CWnd类派生的,且在本类中进行调用,那么我们可以调用CWnd::SendMessage()函数;若希望在不同的情况下发送用户定义消息,只需要将SendMessage函数的参数加以标识就ok了,一种方法就是在消息响应函数中,使用条件语句进行不同情况的处理。

2. 如果希望在其它类中响应这个用户定义消息,那么我们可以选择使用win32 的API。比如:当用户定义消息在CMainFrame中,而它对应的响应函数在其它类当中,需这样做:

::SendMessage(::AfxGetMainWnd()->m_hWnd, WM_MYMSG, 0, 0);

注:或选择使用PostMessage。

————》》》》》SendMessage与PostMessage::待做我还是选择暂时学习前辈的

原文地址:https://www.cnblogs.com/xiawuhao2013/p/9484732.html