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

时间:2014-05-15 16:46:00

标签: c++ mfc afx

我正在使用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多个处理程序。

2 个答案:

答案 0 :(得分:1)

根据TN016: Using C++ Multiple Inheritance with MFC上的 CWnd和消息映射部分,不可能使MFC消息映射与多个继承一起工作,而且多个类型派生自{{1} }任何CWnd - 派生的基数必须是其继承中最左边的一个。由于CWnd派生自CView,因此您无法从这些类中继承多个。

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

答案 1 :(得分: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()