如何处理窗口叠加时的自定义消息路由

来源:互联网 发布:php 字符串分割 编辑:程序博客网 时间:2024/05/22 13:15

先看一个图片


目的: A可能希望接收B,C,D,D1等各个控件的消息。
情况:目前B为一自定义控件,且在B.h向外提供一通知消息WM_B_NOTIFY(WM_USER+101)。
但是A也想要接收C,D的通知消息,那么你可能想要SetBWndNotify,SetCNotify。
但是你需要注意不能使你自定义的消息ID和WM_USER+101相同。这样你可能去B.h里面找那个WM_B_NOTIFY定义的值,倘若控件繁多,你就难以完成这一任务了。


解决:B和其他控件要保持一致性。
NOTE1: 不主动向外提供消息。
当前窗口类的.h文件不要定义向外部通知的消息。
NOTE2: 向外部仅提供一个接口,外部告诉自己消息发送的目的地。
外部告诉控件消息通知的目的地。


示例:加入D控件和D1控件都定义在D.h文件中,我们的D1控件会向D通知消息WM_D1_NOTIFY,并且D也会向外通知消息WM_D_NOTIFY,那么D必须提供一个接口给使用D类的对象(假设A类)调用,这样D的消息就通过该接口向外发送。


A.h里面有:
D m_d;
A.cpp里面有:
#define USER_MESSAGE_BASE (WM_USER + 500)
#define UM_D_NOTIFY (USER_MESSAGE_BASE + 1)
ON_MESSAGE(UM_D_NOTIFY, OnDNotify)
m_d.SetNotifyWindow(GetSafeHwn(), UM_D_NOTIFY);
A::OnDNotify()
{}


千万不要在D.h定义D的通知消息,像下面这种用法不可取。
如:
在D.h里面有WM_D_NOTIFY
在D.cpp里面有GetParent()->PostMessage(WM_D_NOTIFY, wParam, lParam);
在A.cpp里面直接
ON_MESSAGE(WM_D_NOTIFY, OnDNotify)
A::OnDNotify()
{
}

下面是讲解: