功能说明
- 自定义消息进程内有效,可以通过消息通报状态,模块解耦等同步状态。
消息定义
- #define WM_RECMSG_NOTIFY WM_USER+1024
- ON_MESSAGE(WM_RECMSG_NOTIFY, OnMSGNotify)
- afx_msg LRESULT OnMSGNotify(WPARAM wParam, LPARAM lParam);
- SendMessage / PostMessage
函数介绍
- #define WM_RECMSG_NOTIFY WM_USER+1024
- 消息定义ID,在系统WM_USER默认ID上增加1024,避免系统其它应用程序之间冲突; - ON_MESSAGE(WM_RECMSG_NOTIFY, OnMSGNotify)
- 消息ID与函数绑定, 调用发送函数可以触发函数:OnMSGNotify - afx_msg LRESULT OnMSGNotify(WPARAM wParam, LPARAM lParam);
- 消息函数申明,及消息执行体,参数传递可以是值,也可以是指针,根据业务需要进行传递 - SendMessage / PostMessage
- 消息发送函数,第一个参数:消息ID,第二、第三参数为数据、或其他对接指针(地址:数据)
使用说明
编译环境,可通过VC6.0或者更加高:VS2012+版本,初始化位置参照如下实例代码。
实例代码
// 头文件中添加消息函数申明
//{{AFX_MSG(CMSGNotifyDlgDlg)
afx_msg LRESULT OnMSGNotify(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
// 消息定义,建议在WM_USER后面增加
#define WM_RECMSG_NOTIFY WM_USER+1024
BEGIN_MESSAGE_MAP(CMSGNotifyDlgDlg, CDialog)
//{{AFX_MSG_MAP(CMSGNotifyDlgDlg)
ON_MESSAGE(WM_RECMSG_NOTIFY, OnMSGNotify)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
LRESULT OnMSGNotify(WPARAM wParam, LPARAM lParam)
{
// 用于计数消息收到的计数
static int m_msg_cnt = 0;
CString m_MsgText = _T("");
m_msg_cnt++;
// 格式化消息内容
m_MsgText.Format("消息次数 %02d: wParam: %d, lParam: %d", m_msg_cnt, wParam, lParam);
// 显示数据到文本框中
SetDlgItemText(IDC_MSG_EDIT, m_MsgText);
return 0;
}
// 发送消息按钮事件
void OnSndmsgButton()
{
int m_ret = 0;
int m_wp = 0;
int m_lp = 0;
CString wParam = ("");
CString lParam = ("");
// 获取文本中的内容
GetDlgItemText(IDC_WP_EDIT, wParam);
GetDlgItemText(IDC_LP_EDIT, lParam);
// 转化成整数
m_wp = atoi(wParam);
m_lp = atoi(lParam);
// 发送消息到处理函数: OnMSGNotify,打印出来
SendMessage(WM_RECMSG_NOTIFY, m_wp, m_lp);
// 两个消息函数都可以发送,具体差异以后的章节介绍
PostMessage(WM_RECMSG_NOTIFY, m_wp, m_lp);
}
应用场景
- 底层驱动、数据更新,或者状态变更,业务端需要获取状态,避免轮询,及代码相互嵌套,通过消息方式通信非常实用,业务扩展强,可以通过参数扩展区分更多状态。
实例图片
下期预告
- 创建属于自己的动态库
评论留言
- 有兴趣的课题,欢迎大家评论区留言。