在从CWnd派生的类的实例中,是否可以将所有MFC消息转发(重定向)到另一个对象,而无需为每个可能的消息编写单独的处理程序和消息映射?具体来说,我想将所有未处理的WM_消息转发给另一个对象。如果这不可能,那么对象是否可以监听其他对象中发生的事件?我可以提供详细信息,如果这有助于澄清我的问题。
感谢。
答案 0 :(得分:4)
你需要瞄准比MFC低一点。您应该覆盖窗口的PreTranslateMessage方法并直接处理消息。
获得主消息循环后,您可以选择应用程序处理哪些消息循环以及将哪些消息循环发送给另一个应用程序。如果您选择发送消息,我建议使用SendMessageTimeout(...)
答案 1 :(得分:1)
我认为您需要子类化。
答案 2 :(得分: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等。如果你专门处理命令消息,那么你有一些额外的选择。
答案 3 :(得分:0)
好吧,因为我似乎无法发表评论,我会将此作为答案发布。我遇到布拉德的答案后遇到问题,其中一些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消息。如果有人遇到同样的问题我会张贴这个。
无论如何,感谢帮助布拉德,你的答案对我帮助很大。