Карта сообщений 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 обработчиков.

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

Другие решения

По разделу CWnd и Карты сообщений на TN016: использование множественного наследования C ++ с MFC, невозможно заставить карту сообщений MFC работать с множественным наследованием более чем с одним типом, полученным из CWnd как любой CWndполученная база должна быть самой левой в своем наследовании. поскольку CView происходит от CWndВы не можете умножить наследование от этих классов.

Чтобы избежать прямого дублирования вашего кода, возможно, вы сможете реорганизовать код, которым хотите поделиться, в какой-то миксин, возможно, с использованием композиции или CRTP.

1