Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 消息映射MFC:继承多个消息映射_C++_Mfc_Afx - Fatal编程技术网

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

C++ 消息映射MFC:继承多个消息映射,c++,mfc,afx,C++,Mfc,Afx,我使用的是MFC100、VS2010和MDI 我过度使用了CPreviewView的基本功能 我希望它的行为非常类似于我的CMyView(这是一个CView) CMyView和CMyPreviewView不在同一类继承路径中 因此,我希望继承CPreviewView消息映射和CMyView消息映射。目前,它仅继承CPreviewView消息映射 BEGIN_MESSAGE_MAP(CMyPreviewView, CPreviewView) //{{AFX_MSG_MAP(CMyPrevi

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

根据上的CWnd和消息映射部分,无法使MFC消息映射与多继承一起工作,因为任何
CWnd
派生的类型都必须是其继承中最左边的派生基。由于
CView
派生自
CWnd
,因此不能从这些类进行乘法继承


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

将消息映射放在单独的.h文件中,并将其包含在两个类中

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()

我似乎记得很久以前读过一篇关于MFC的“多重继承”的文章,但它并不好看。有什么原因不能只使用CMyView并将CMyPreviewView嵌入其中?应该足够简单。CMyPreviewView和CMyView是完全不同的类。“CMyPreviewView->CPreviewView->CScrollView…->CView”和“CMyView->CView”不能位于同一继承路径中。。我只想让他们有相同的命令处理程序。没有复制、粘贴和维护两个位置。这不是我的意思,但你似乎发现你的解决方案太简单了。对不起,我想我弄糊涂了。我没有使用“类多重继承”,我指的是“消息映射继承”。我希望CMyPreviewView类有两个消息映射,CPreview和CMyView消息映射。您是说我可以将命令处理程序移动到单独/单个位置?在两个地方都提到它?像宏/定义?