Я использую 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 обработчиков.
Поместите карту сообщений в отдельный файл .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()
По разделу CWnd и Карты сообщений на TN016: использование множественного наследования C ++ с MFC, невозможно заставить карту сообщений MFC работать с множественным наследованием более чем с одним типом, полученным из CWnd
как любой CWnd
полученная база должна быть самой левой в своем наследовании. поскольку CView
происходит от CWnd
Вы не можете умножить наследование от этих классов.
Чтобы избежать прямого дублирования вашего кода, возможно, вы сможете реорганизовать код, которым хотите поделиться, в какой-то миксин, возможно, с использованием композиции или CRTP.