MFC编程中,BEGIN_MESSAGE_MAP、END_MESSAGE_MAP可以为空吗?

Posted

技术标签:

【中文标题】MFC编程中,BEGIN_MESSAGE_MAP、END_MESSAGE_MAP可以为空吗?【英文标题】:In MFC programming, can BEGIN_MESSAGE_MAP, END_MESSAGE_MAP be empty? 【发布时间】:2019-08-05 09:44:33 【问题描述】:

    如果 BEGIN_MESSAGE_MAP/END MESSAGE 对之间没有要处理的事件,我可以安全地删除它们吗?

    我本来可以的

    类 MyListView : 公共 ListView

    类 MySpecialisedListView : public MyListView

并且 MySpecialisedListView 有要处理的事件,但 MyListView 没有。 我能否删除 MyListView 的 BEGIN_MESSAGE_MAP/END MESSAGE 对,并确保 MySpecialisedListView 中未处理的任何事件仍将由 ListView 事件处理程序提供服务,尽管中间的继承类没有事件处理程序?

Microsoft 的 MSDN 和 MFC 文档没有涵盖这一点。

谢谢

【问题讨论】:

为什么要这样做? 因为它使代码更小。它的原则是,如果该类不需要某些东西,则不要添加它(但前提是它是安全和正确的) 在我的情况下,BEGIN_MESSAGE_MAP/END MESSAGE 之一(为空)用于 AboutDlg,当我在创建新项目时取消选中它时,它在代码中不存在 【参考方案1】:

我认为你是安全的。请记住同时从.h 文件中删除DECLARE_MESSAGE_MAP()

之所以有效,是因为这些宏基本上创建了此函数的覆盖:

virtual const AFX_MSGMAP* GetMessageMap() const
 return GetThisMessageMap(); 

以及从继承的基类中隐藏一个的静态成员函数。

static const AFX_MSGMAP* GetThisMessageMap()

    static AFX_MSGMAP messageMap = 
         baseClass::GetThisMessageMap(), <mapped_messages>... ;
    return &messageMap;

如果你不覆盖它,那么它将使用从基类继承的那些,并且一切都会按预期工作。

【讨论】:

以上是关于MFC编程中,BEGIN_MESSAGE_MAP、END_MESSAGE_MAP可以为空吗?的主要内容,如果未能解决你的问题,请参考以下文章

初识MFC----消息映射机制

MFC SDI 动态创建按钮

在启动前隐藏一个MFC DoModal对话框

MFC列表右键弹出菜单

Mfc CComboBoxEx - 如何更改背景颜色

VS2015 MFC 自定义消息步骤