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

本文探讨了在软件开发中如何有效地管理控件之间的消息通知,强调了保持一致性的重要性,并提供了实现这一目标的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看一个图片


目的: 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()
{
}

下面是讲解:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值