3

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

谢谢。

4

4 回答 4

4

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

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

于 2009-06-10T21:03:40.113 回答
1

我认为你需要子类化

于 2009-06-10T21:05:51.107 回答
1

不,您不能真正按照您的要求做,但您可能不必这样做。(您的问题的一些更多细节可能是有序的。)当您创建一个消息映射时,您指定它应用到的类和该类的基类。如果您的派生类没有特定消息的消息映射条目,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 等。如果您正在专门处理命令消息,那么您还有一些额外的选择。

于 2009-06-10T21:08:02.210 回答
0

好吧,因为我似乎无法发表评论,所以我会发布这个作为答案。在 Brad 的回答之后我遇到了一个问题,其中一些 WM_COMMANd 消息没有通过 PreTranslateMessage 函数路由(请参阅我对我的问题的回答如果我没有为它的相应命令声明消息映射条目,如何阻止 MFC 禁用我的控件?)但是是通过 OnCommand 所以基本上我覆盖了 OnCommand 函数来转发所有 WM_COMMAND 消息。我发布这个以防有人遇到同样的问题。

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

于 2009-10-03T14:04:00.203 回答