【问题标题】:How to redirect MFC messages to another object?如何将 MFC 消息重定向到另一个对象?
【发布时间】:2010-11-01 23:02:50
【问题描述】:

在从 CWnd 派生的类的实例中,是否可以将所有 MFC 消息转发(重定向)到另一个对象,而无需为每个可能的消息编写单独的处理程序和消息映射?具体来说,我想将所有未处理的 WM_ 消息转发到另一个对象。如果这是不可能的,那么对象是否可以监听其他对象中发生的事件?如果这有助于澄清我的问题,我可以提供详细信息。

谢谢。

【问题讨论】:

    标签: mfc messages cwnd


    【解决方案1】:

    您的目标需要比 MFC 低一点。您应该覆盖窗口的 PreTranslateMessage 方法并直接处理消息。

    拥有主消息循环后,您可以选择哪些由您的应用处理,哪些发送/发布到另一个。如果您选择发送消息,我建议您使用 SendMessageTimeout(...)

    【讨论】:

    • 谢谢;覆盖 PreTranslateMessage() 正是我需要的解决方案。
    • 您是说 PreTranslateMessage 吗?从 Geoff 的评论看来,你做到了。 AFAIK PreProcessMessage 是 dotnet。 PreTranslateMessage 是一个 MFC 函数。我认为编辑答案以避免混淆会有所帮助。
    【解决方案2】:

    好吧,因为我似乎无法发表评论,所以我会发布这个作为答案。在 Brad 的回答之后我遇到了一个问题,其中一些 WM_COMMANd 消息没有通过 PreTranslateMessage 函数路由(请参阅我对我的问题的回答 How to stop MFC from disabling my controls if I don't declare a message map entry for it's corresponding command?),而是通过 OnCommand,所以基本上我覆盖了 OnCommand 函数来转发所有 WM_COMMAND 消息。我发布这个以防万一有人遇到同样的问题。

    无论如何感谢布拉德的帮助,你的回答对我帮助很大。

    【讨论】:

      【解决方案3】:

      不,您不能真正按照您的要求去做,但您可能不必这样做。 (您的问题的一些更多细节可能是有序的。)当您创建一个消息映射时,您指定它应用到的类和该类的基类。如果您的派生类没有特定消息的消息映射条目,MFC 将检查基类的消息映射。如果基类消息映射没有条目,它将检查消息映射的基类,依此类推。

      例如,假设您有一堆具有通用功能的对话框。你可以这样布置你的课程:

      class CMyBaseDialog : public CDialog {
          DECLARE_MESSAGE_MAP();
      }
      
      BEGIN_MESSAGE_MAP(CMyBaseDialog, CDialog)
          // Handle any common messages here...
      END_MESSAGE_MAP()
      
      class CDerivedDialog : public CMyBaseDialog {
           DECLARE_MESSAGE_MAP();
      }
      
      BEGIN_MESSAGE_MAP(CDerivedDialog, CMyBaseDialog)
          // Handle any specific messages here...
      END_MESSAGE_MAP()
      

      这同样适用于所有其他基于 HWND 的类,例如 CWnd、CView、CFrame 等。如果您专门处理命令消息,那么您还有一些其他选择。

      【讨论】:

        【解决方案4】:

        我认为你需要子类化

        【讨论】:

        • 调用 SubclassWindow() 在我的实现中并没有完全奏效,但我会记住它以备将来使用。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        相关资源
        最近更新 更多