一、知识准备
消息映射就是把消息标识和处理函数联系起来。
建立消息映射需要使用消息映射宏。
不同类型的消息映射,需要使用不同类型的消息映射宏。
消息类型 宏格式 宏参数
标准Windows消息 ON_WM_XXX 无参数
命令消息 ON_COMMAND 命令ID,处理函数名
更新命令消息 ON_UPDATE_COMMAND_UI 命令ID,处理函数名
控件通知消息 ON_XXX 控件ID,处理函数名
用户自定义消息 ON_MESSAGE 自定义消息ID,处理函数名
已注册的Windows消息 ON_REGISTERED_MASSAGE 消息ID,处理函数名
二、案例简介
工程名:xx 基于对话框
自定义消息 WM_MYMSG 及其消息响应函数 MsgFun()。
在对话框中添加 一个按钮: IDC_START Caption:开始 及其BN_CLICKED 消息响应函数 OnStart()
每点击一次按钮,按钮上的文字会变成“点击x次”,当点击次数是5的倍数时,按钮的处理函数 OnStart() 会发出一条自定义消息 WM_MYMSG
主窗口收到这条自定义消息后,自定义消息的处理函数会弹出一个对话框。
三、添加代码
1、在CxxDlg.h 文件的开始 定义消息 #define WM_MYMSG WM_USER+1
2、在CxxDlg.h 文件中,CxxDlg 定义的里面,声明自定义消息的处理函数原型
CxxDlg:public CDialog
{
public:
LRESULT MsgFun(WPRAR wParam,LPARAM lParam);
.....
}
3、在CxxDlg.cpp文件中,进行消息映射
BEGIN_MESSAGE_MAP(CMy233Dlg, CDialog)
//{{AFX_MSG_MAP(CMy233Dlg)
......
ON_MESSAGE(WM_MESG,MesgFun)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
4、在CxxDlg.cpp文件中,编写响应函数的实现
LRESULT CxxDlg::MesgFun(WPARAM wParam,LPARAM lParam)
{
CString str;
str.Format("你已经点击了%d次!",num);
MessageBox(str,"",MB_OK);
return 0;
}
这个处理函数收到自定义消息后,只做了一件事,弹出一个对话框。
5、这个自定义消息从哪里发出?怎么发出呢?
void CxxDlg::OnStart() // 从按钮的BN_CLICKED响应函数里发出
{
// TODO: Add your control notification handler code here
CString str;
str.Format("%s%d%s","点击",num+1,"次"); // num 是CxxDlg类的整型成员变量
GetDlgItem(IDC_START)->SetWindowText(str); // 变换按钮的显示文本
num++;
if (num%5==0)
{
SendMessage(WM_MESG,0,0); // 通过函数SendMessage()发出,第一个参数WM_MESG 就是我们自定义的消息。
}
}