自定义WM_NOTIFY消息
习惯了用自定义用户消息进行各种状态的通知,特别是子窗口与父窗口之间的交互。但ON_MESSAGE没有控件ID的限制,如果有多个子窗口发送同一个消息给父窗口时,父窗口就不知道哪个窗口发的(当然可以用参数进行约定)。
如何解决这个问题?
有几种思路:1.重写ON_MESSAGE宏,增加ID的限制;2.模拟按钮单击消息;3.自定义WM_NOTIFY消息。基于这些思路都不能修改MFC底层的代码。
用调试的方式查看MFC的实现代码,发现重写ON_MESSAGE宏不能实现,具有ID判断的只在WM_NOTIFY和WM_COMMAND两个消息中,两个消息最终都会进入CCmdTarget::OnCmdMsg函数进行ID判断。在比较之下,决定使用WM_NOTIFY消息。
下面分析下WM_NOTIFY消息的路由过程。
分析CWnd::OnWndMsg函数,在MFC中窗口消息在这边派送的。关于WM_NOTIFY消息的代码如下:
LRESULT lResult = 0;
...
// special case for notifies
if (message == WM_NOTIFY)
{
NMHDR* pNMHDR = (NMHDR*)lParam;
if (pNMHDR->hwndFrom != NULL && OnNotify(wParam, lParam, &lResult))
goto LReturnTrue;
return FALSE;
}
OnNotify的定义如下:
BOOL CWnd::OnNotify(WPARAM, LPARAM lParam, LRESULT* pResult)
可以发现这边忽略了WPARAM的作用,lParam的参数实际指向NMHDR* pNMHDR信息。
在OnNotify中进过必要的处理后进入OnCmdMsg函数,在这个函数中会找相应的消息映射,并进行ID对应。如果找到会进入_AfxDispatchCmdMsg函数调用对应的消息函数。
分析到这,我们比较关心的是NMHDR结构体的定义
typedef struct tagNMHDR
{
HWND hwndFrom;
UINT_PTR idFrom;
UINT code; // NM_ code
} NMHDR;
通过分析代码发现:
hwndFrom:必须有,声明消息来自哪个窗口。
idFrom:可有可无,声明窗口ID
code:具体的子消息,即通知类型。非常关键。
分析到此,我们实现下自定义notify.
1.定义通知类型:
#define WM_GRID_SELECT_CHANGE(WM_USER + 1)
2.增加消息映射函数,并实现:
afx_msg void OnNotifyGridChanged(NMHDR *pNMHDR, LRESULT *pResult);
3.增加映射对应关系:
ON_NOTIFY(WM_GRID_SELECT_CHANGE, GRIDCTRL_ID, &CContradictionRuleView::OnNotifyGridChanged)
4.在子窗口中发送WM_NOTIFY消息
if (this->GetParent())
{
NMHDR nmhdr;
nmhdr.hwndFrom= this->m_hWnd;
nmhdr.idFrom
= 0;//m_id;
nmhdr.code
= WM_GRID_SELECT_CHANGE; // 用户自定义消息
//发送notify消息
this->GetParent()->SendMessage(WM_NOTIFY, (WPARAM)nmhdr.idFrom,(LPARAM)&nmhdr);
}
OK到此实现了自定义的notify消息。希望对你有所帮助,如果有什么疑问请联系wjh_2010@163.com。
版权所有,如需转载请声明出处和作者(wjh_2010@163.com)
分享到:
相关推荐
WM_NOTIFY消息流程实例分析---对应博客代码
分析与理解通知消息-WM_NOTIFY
MFC 全面解读WM_NOTIFY
ON_COMMAND, ON_MESSAGE, ON_NOTIFY它们的区别,详细介绍这三种消息模型
在WM_NOTIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信 WM_CONTEXTMENU= $007B //当用户某个窗口中点击了一下右键就发送此消息给这个窗口 WM_styleCHANGING= $007C //当调用SETWINDOWLONG函数将要...
python库,解压后可用。 资源全名:cdk_ecr_image_scan_notify-0.0.139-py3-none-any.whl
批量付款到支付宝账户有密接口-batch_trans_notify(20150528),主要是自己使用
erlang-sd_notify-1.0-2.el7.x86_64.rpm
webmagic 最新包 修复protocol_version,Received close_notify during handshake
该hack解决了Docker容器在systemd下运行并希望利用sd_notify工具的问题。 由于Docker容器最终作为Docker守护程序的子进程运行,因此它们与服务所在的cgroup位于不同的cgroup中。 因此,systemd将不会处理来自它们的...
Android4.4_PhoneState_Notify_Flow
以WM_NOTIFY和WM_COMMAND消息形式发送的通知消息包含各种信息。WM_COMMAND消息的参数包含发送通知消息的控件ID,控件的窗口句柄和通知代码,WM_NOTIFY消息的参数还包含一个NMHDR数据结构的指针。
python库。 资源全名:cdk_ecr_image_scan_notify-0.0.241-py3-none-any.whl
python库,解压后可用。 资源全名:django_statusboard_notify-0.2.0-py3-none-any.whl
python库。 资源全名:cdk_events_notify-1.0.26-py3-none-any.whl
python库。 资源全名:cdk_events_notify-1.0.10-py3-none-any.whl
资源来自pypi官网。 资源全名:cdk_ecr_image_scan_notify-0.0.171-py3-none-any.whl