Моя программа / среда … VS2010, C ++, MFC100, CWinAppEx, CMDIFrameWndEx. Пакет функций MFC.
Я создаю и обрабатываю производную CPreviewView. Мой метод обрабатывает это представление предварительного просмотра как нормальное представление, которое пользователь может поддерживать и активно. Где PreviewView по умолчанию закрашивает текущий вид и «захватывает» дочерний кадр.
Одна вещь, которую я не могу понять, это как получить контроль над картами сообщений ON_UPDATE_COMMAND_UI, которые должны быть направлены на все CDocuments. Когда CPreviewView создан, он как-то отключает все обработчики команд для CDocuments. Обработчики команд для CViews все еще работают и работают.
Все документы, открытые в моем приложении MDI, не получают своих сообщений ON_UPDATE_COMMAND_UI. Я могу переместить эти обработчики сообщений в View или Frame, но их слишком много, чтобы сделать это эффективно.
Кто-нибудь знает, где в классе CPreviewView отключаются обработчики документов?
Во-первых, MFC не является «закрытой» структурой. Его полный источник находится на вашем ПК в следующей папке: «папка Visual Studio» \ VC \ atlmfc \ src \ mfc \ (на моем компьютере это: c: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ atlmfc \ src \ mfc) Источник для CPreviewView находится в viewprev.cpp
файл. Я только что открыл файл и в DoPrintPreview они вызывают это:
pParent->OnSetPreviewMode(TRUE, pState); // Take over Frame Window
В соответствии с MSDN Этот метод:
Реализация по умолчанию отключает все стандартные панели инструментов и скрывает главное меню и главное окно клиента. Это превращает окна кадров MDI во временные окна кадров SDI.
Я открыл файл с именем winfrm.cpp
и проверил, что этот метод делает, и он отключает все меню. Очевидно, что никакие сообщения об обновлении не будут отправляться в документы при включенном режиме предварительного просмотра.
В статье MSDN по гиперссылке выше сказано, что вам нужно переопределить OnSetPreviewMode
метод для вашего кадра:
настроить скрытие и отображение панелей управления и других частей окна кадра во время предварительного просмотра. Вызовите реализацию базового класса из переопределенной версии.
Это не должно быть проблемой.