惠州做网站的,深圳做网站开发,上海百度公司地址,室内设计公司排名十强在MFC开发中#xff0c;主要核心机制就是消息机制。QT与之类似的机制就是信号与槽。QT中的信号与槽是非常容易自定义的#xff0c;MFC也是如此#xff0c;自定义也是比较方便#xff0c;况且自定义消息或者控件在整个GUI图形化界面开发中也是非常重要的部分#xff0c;上篇…在MFC开发中主要核心机制就是消息机制。QT与之类似的机制就是信号与槽。QT中的信号与槽是非常容易自定义的MFC也是如此自定义也是比较方便况且自定义消息或者控件在整个GUI图形化界面开发中也是非常重要的部分上篇文章我们介绍了QT中自定义信号与槽这篇文章就来带着大家来实现一下MFC的自定义消息
在实现之前我们先来了解一下MFC中的消息机制
消息机制
消息机制既消息映射就像映射表一样消息映射是一个将消息和成员函数相互关联的表
这种映射要得益于MFC的底层封装他屏蔽了代码的底层逻辑用户只需要进行消息id与函数的绑定就能实现指定按钮的事件触发
消息机制由系统管理可以将消息精准投放到对应窗口的消息队列中
自定义消息实现
自定义消息主要分为以下几个步骤 自定义消息id 自定义消息响应函数 指定对话框注册消息 实现消息响应函数 触发自定义消息
详细步骤 自定义消息id 自定义消息id一般用define进行宏定义注意ID一定是大于WM_USER因为WM_USER之前的已经被系统占用了用了可能会出现未知的错误 自定义消息响应函数 我们在注册消息时一般使用ON_MESSAGE这个宏进行注册所以消息的响应函数要符合ON_MESSAGE参数所规定的函数规范 指定对话框注册消息 在MFC中每个对话框都对应这一个消息注册表需要把消息id和响应函数结合起来用ON_MESSAGE(message, memberFxn)指示哪个函数将处理用户定义的消息与映射表的功能相似参数一消息ID、参数二为消息的响应函数 实现消息响应函数 注册成功后用户发送的对应消息就会传到我们的响应函数里面具体业务实现就需要大家自己实现了 触发自定义消息 自定义消息一般通过SendMessage或PostMessage函数进行消息触发
代码实现
自定义消息id
#define WM_TEST (WM_USER 1) // 自定义消息 自定义消息响应函数
自定义消息响应函数这里我们来参考以下ON_MESSAGE宏里面的函数要求 可以看到ON_MESSAGE的函数要求是返回值类型为LRESULT参数有两个类型分别为WPARAM和LPARAM
这里我们要说明以下MFC的做法就没有QT的方便QT是允许用户自定义信号与槽函数的参数的所以这一点可以看出QT还是要比MFC方便的
// 自定义消息响应函数
afx_msg LRESULT OnTest(WPARAM wParam, LPARAM lParam); 指定对话框注册消息
下面就可以在对应对话框的消息注册表中使用ON_MESSAGE宏进行自定义消息的注册了
BEGIN_MESSAGE_MAP(MainDlg, CDialog)ON_BN_CLICKED(IDOK, MainDlg::OnBnClickedOk)ON_BN_CLICKED(IDCANCEL, MainDlg::OnBnClickedCancel)ON_MESSAGE(WM_TEST, MainDlg::OnTest) // 自定义消息注册
END_MESSAGE_MAP() 实现消息响应函数
这里我们也没有主要业务场景所以这里我们就打印一下日志并输出一下这两个形参的值好了
LRESULT MainDlg::OnTest(WPARAM wParam, LPARAM lParam)
{TRACE(_T(自定义消息被触发 wParam:%s lParam:%d\r\n), wParam, lParam);return 0;
} 触发自定义消息
我们就在点击确定按钮时利用SendMessage或PostMessage函数触发我们的自定义消息
void MainDlg::OnBnClickedOk()
{// 在此添加控件通知处理程序代码// CDialog::OnOK();::SendMessageA(GetSafeHwnd(), WM_TEST, (WPARAM)LMr.Lu, 666);CWinThread* thread AfxGetThread();::PostMessageA(GetSafeHwnd(), WM_TEST, (WPARAM)LMr.Lu, 666);
} 测试
下面我们就来实际运行测试一下我们的代码
预期结果自定义消息函数触发两次 如我们所料点击确定按钮自定义消息函数被触发了两次
到这里MFC自定义消息就介绍完了
感谢观看学习大佬们多多指点愿明天的自己会感谢当下的努力