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