消息映射 MFC:继承多个消息映射

Posted

技术标签:

【中文标题】消息映射 MFC:继承多个消息映射【英文标题】:Message Map MFC: Inheriting multiple message maps 【发布时间】:2014-05-15 16:45:59 【问题描述】:

我正在使用 MFC100、VS2010、MDI。

我放弃了 CPreviewView 的基本功能。

我希望它的行为与我的 CMyView(这是一个 CView)非常相似

CMyView 和 CMyPreviewView 不在同一个类继承路径中。

所以我想同时继承 CPreviewView 消息映射和 CMyView 消息映射。目前,它只继承 CPreviewView 消息映射。

BEGIN_MESSAGE_MAP(CMyPreviewView, CPreviewView)
    //AFX_MSG_MAP(CMyPreviewView)
    ON_COMMAND(AFX_ID_PREVIEW_CLOSE, OnPreviewClose)
    ON_COMMAND(AFX_ID_PREVIEW_PRINT, OnPreviewPrint)
    ON_UPDATE_COMMAND_UI(ID_WINDOW_NEW, OnUpdateWindowNew)
    //AFX_MSG_MAP
END_MESSAGE_MAP()

有什么想法吗?我看到了类似的东西

ALT_MSG_MAP(UINT msgMapID)

但这仅适用于 ATL。我可以复制并粘贴我的整个 CMyView 消息映射,但是因为有 300 多个处理程序,这真的很混乱。

【问题讨论】:

我好像记得很久以前读过一篇关于 MFC 的“多重继承”的文章,它并不漂亮。有什么理由不能只使用 CMyView 并将 CMyPreviewView 嵌入其中?应该足够简单。 CMyPreviewView 和 CMyView 是完全不同的类。 “CMyPreviewView->CPreviewView->CScrollView...->CView”和“CMyView->CView”它们不能在同一个继承路径中。我只是希望它们具有相同的命令处理程序。无需复制粘贴和维护 2 个位置。 不是我的意思,但您似乎找到了解决方案。 【参考方案1】:

将消息映射放入单独的 .h 文件中,并将 #include 放入两个类中。

BEGIN_MESSAGE_MAP(CMyPreviewView, CPreviewView)
    //AFX_MSG_MAP(CMyPreviewView)
    ON_COMMAND(AFX_ID_PREVIEW_CLOSE, OnPreviewClose)
    ON_COMMAND(AFX_ID_PREVIEW_PRINT, OnPreviewPrint)
    ON_UPDATE_COMMAND_UI(ID_WINDOW_NEW, OnUpdateWindowNew)

#include "SharedViewMessageMap.h"

    //AFX_MSG_MAP
END_MESSAGE_MAP()

【讨论】:

【参考方案2】:

根据TN016: Using C++ Multiple Inheritance with MFC 上的CWnd 和消息映射 部分,不可能使 MFC 消息映射与多重继承一起使用从CWnd 派生的多个类型作为任何@ 987654323@-derived base 必须是其继承中最左边的一个。由于CView 派生自CWnd,因此您不能从这些类中多次继承。

为了避免直接重复您的代码,您可以将希望共享的代码重构为某种 mixin,可能使用组合或 CRTP。

【讨论】:

对不起,我想我把这弄糊涂了。我没有使用“类多重继承”,我指的是“消息映射继承”。我希望 CMyPreviewView 类有 2 个消息映射、CPreview 和 CMyView 消息映射。 你是说我可以将命令处理程序移动到一个单独的/单一的地方吗?并在两个地方都引用它?像宏/定义?

以上是关于消息映射 MFC:继承多个消息映射的主要内容,如果未能解决你的问题,请参考以下文章

MFC如何给菜单添加消息映射

猎豹MFC--消息映射

消息映射机制的介绍

猎豹MFC1 第一个窗口CWinApp CFrameWnd InitInstance 消息映射CPaint CRect Create

生成的 mfc 消息映射无效

Win32 消息泵与 MFC 消息映射,哪个更快? C++