1

我正在使用 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 多个处理程序,这真的很混乱。

4

2 回答 2

1

根据 TN016 上的CWnd和消息映射部分:Using C++ Multiple Inheritance with MFC,不可能使 MFC 消息映射与多重继承一起工作,CWnd因为任何CWnd派生的基必须是最左边的派生类型一个在它的继承。由于CView派生自CWnd,您不能从这些类乘以继承。

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

于 2014-05-15T17:07:00.457 回答
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()
于 2014-05-15T18:15:33.930 回答