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