首页 > 解决方案 > SendMessage 发送的消息在其他类层次结构中未收到

问题描述

我有两个类层次结构,如下所示:

  1. A 类扩展 CWnd
    • B 扩展 A
    • C 扩展 B。
  2. D 类扩展 CWnd
    • E 扩展 D

我怎么SendMessage能从CD

附加信息(来自评论):

消息映射正确完成,消息已注册。这是我尝试过的:

  1. 我调用SendMessage(...)了 C 类的成员函数,它不起作用。

  2. 当我这样做时,GetTopLevelParent()->SendMessage(...)它正在工作。

但在第二种情况下,它击中了监听器函数3 次。你能解释一下为什么吗?

标签: c++mfcsendmessage

解决方案


由于这两个类(直接CD间接)都派生自CWnd,因此它们都应该能够接收通过 发送的消息SendMessage对我来说,在D.

确实,您拥有的不是两个层次结构。由于公共根类是CWnd,它是一个层次结构

  • CWnd(公共根类)
    • A(扩展 CWnd)
      • B(扩展 A)
        • C(扩展 B)
    • D(扩展 CWnd)
      • E(扩展 D)

您必须将用户定义的处理程序添加到D.

BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
   ON_MESSAGE( <message>, <memberFxn> )
   // ...
END_MESSAGE_MAP()

阅读此处了解更多信息

发送到不同的CWnd对象

至于发送到某个派生类的对象,调用它就CWnd足够了。这也是可能的,而不必“作为发件人派生”,例如:SendMessageCWmd

LRESULT send_to_D(D* d) {
   return d->SendMessage(WM_APP+1, 0, 0);
}

基础设施

MFC 提供对基本 Windows 消息传输技术的轻松访问。[1]这种消息传递技术不仅用于传递信息,还用于管理控制流。它的主要目标是为事件驱动的应用程序提供基础设施。在这里阅读更多:


[1] C++窗口对象和HWND的关系| 微软文档


推荐阅读