自定义消息的创建与实现(c++)
1:自定义消息分为以下4个步骤:
a.消息定义
在stdafx.h头文件中加入如下代码:
#define WM_MSG WM_USER+100,WM_MSG是用户自己定义的一个消息名称.
WM_USER是window为用户预留的,比它小的都为系统消息.
为了避免冲突,应适当设置
b.消息声明
afx_msg LONG OnMyMsg(WPARAM wParam,LPARAM lParam)
DECLARE_MESSAGE_MAP,通常消息的处理函数都以On开头
c.消息映射
ONMESSAGE是用来处理自定义消息的宏,增加的自定义消息主要通过它来传递
BEGIN_MESSAGE_MAP()
ONMESSAGE(WM_MSG,OnMyMsg)
END_MESSAGE_MAP()
d.实现消息处理函数
/***************************************************/
实例Example实现步骤:
Part one:发送端:SendCustomeMsg
新建MFC对话框,命名为SendCustomeMsg
a.在CSendCustomeMsgDlg.cpp预处理中加入如下定义的消息
#define WM_ENABLEBUTTON WM_USER+100
b.对话框加入一个按钮,具体代码如下:
HWND hwnd=::FindWindow (NULL,"ReceiveCustomeMsg");
if(hwnd==NULL)
{
AfxMessageBox("没有收到接收消息的窗体");
return;
}
//param1:HANDLE
//param2:Message
//param3:WPARAM
//param4:LPARAM
::SendMessage (hwnd,WM_ENABLEBUTTON,0,0);
Part two:接收端:ReceiveCustomeMsg
新建MFC对话框,命名为ReceiveCustomeMsg
a.在CReceiveCustomeMsgDlg.cpp 的OnInitDialog加入如下代码
GetDlgItem(btnTagMessage)->EnableWindow(FALSE);
b.在CSendCustomeMsgDlg.cpp中加入与发送端一样的消息定义
#define WM_ENABLEBUTTON WM_USER+100
c.在CSendCustomeMsgDlg.cpp中加入消息宏及相应的映射函数
BEGIN_MESSAGE_MAP(CReceiveCustomeMsgDlg, CDialog)
//{{AFX_MSG_MAP(CReceiveCustomeMsgDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_ENABLEBUTTON,OnReceive) //增加部分
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
d.在CSendCustomeMsgDlg.h中加入消息映射函数的声明
//映射函数的声明
afx_msg void OnReceive(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
e.消息映射函数的具体实现代码
在CSendCustomeMsgDlg.cpp中加入如下代码
void CReceiveCustomeMsgDlg::OnReceive (WPARAM wParam,LPARAM lParam)
{
if(wParam==0 && lParam==0)
{
GetDlgItem(btnTagMessage)->EnableWindow(TRUE);
AfxMessageBox("按钮已被启用");
}
}
Part three:实例运行顺序:
先启动ReceiveCustomeMsg.exe,再启动SendCustomeMsg.exe