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

Другие вопросы по тегам