【发布时间】:2010-11-01 23:02:50
【问题描述】:
在从 CWnd 派生的类的实例中,是否可以将所有 MFC 消息转发(重定向)到另一个对象,而无需为每个可能的消息编写单独的处理程序和消息映射?具体来说,我想将所有未处理的 WM_ 消息转发到另一个对象。如果这是不可能的,那么对象是否可以监听其他对象中发生的事件?如果这有助于澄清我的问题,我可以提供详细信息。
谢谢。
【问题讨论】:
在从 CWnd 派生的类的实例中,是否可以将所有 MFC 消息转发(重定向)到另一个对象,而无需为每个可能的消息编写单独的处理程序和消息映射?具体来说,我想将所有未处理的 WM_ 消息转发到另一个对象。如果这是不可能的,那么对象是否可以监听其他对象中发生的事件?如果这有助于澄清我的问题,我可以提供详细信息。
谢谢。
【问题讨论】:
您的目标需要比 MFC 低一点。您应该覆盖窗口的 PreTranslateMessage 方法并直接处理消息。
拥有主消息循环后,您可以选择哪些由您的应用处理,哪些发送/发布到另一个。如果您选择发送消息,我建议您使用 SendMessageTimeout(...)
【讨论】:
好吧,因为我似乎无法发表评论,所以我会发布这个作为答案。在 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 消息。我发布这个以防万一有人遇到同样的问题。
无论如何感谢布拉德的帮助,你的回答对我帮助很大。
【讨论】:
不,您不能真正按照您的要求去做,但您可能不必这样做。 (您的问题的一些更多细节可能是有序的。)当您创建一个消息映射时,您指定它应用到的类和该类的基类。如果您的派生类没有特定消息的消息映射条目,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 等。如果您专门处理命令消息,那么您还有一些其他选择。
【讨论】:
我认为你需要子类化。
【讨论】: