Один из вариантов, который у вас есть, - это непосредственно разместить свой MFC в WPF или встроить WPF в свое приложение MFC, как описано в статье WPF и Win32 Interoperation MSDN. В частности, ознакомьтесь с двумя пошаговыми руководствами, упомянутыми в начале этой статьи.
Я обнаружил, что встраивание WPF в код MFC намного проще, чем повторное размещение приложения MFC в WPF.
Размещение WPF в MFC - это просто вопрос правильного использования класса HwndSource (если вы не боитесь использовать Managed C ++, вы можете создать хороший уровень взаимодействия и избежать использования флага / clr в вашем проекте MFC в целом.)
Размещение вашего приложения MFC в приложении WPF будет сложнее, если вы пытаетесь переназначить приложение MDI, но оно позволяет вам размещать отдельные кадры в любом месте вашего кода WPF (например, с использованием областей Prism.) В этом В этом случае я вручную удалил весь код управления кадрами MDI.
Для этого я создал свой собственный CMultiDocTemplate
-приобретенный класс и переопределил виртуальный метод OpenDocumentFile()
для обеспечения моего собственного поведения открытия фрейма. Этот метод вручную создал специальный CMDIChildWnd
-обработанный кадр, созданный мной, который перекрывал любой метод, взаимодействующий с окном родительского фрейма MDI, и передавал их в базовый CFrameWnd
(в обход CMDIChildWnd
).
Во-первых, объект вспомогательной функции, который создает ваш фрейм (m_pFrameClass - это ваш специальный класс, производный от CMDIChildWnd, описанный выше)
HWND CreateHostedFrame (родитель HWND)
CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();
CWnd parentWnd;
parentWnd.Attach(parent);
pFrame->LoadFrame(resourceID, WS_CHILD, &parentWnd, pContext);
parentWnd.Detach();
return pFrame->m_hWnd;
Тогда ваш переопределенный метод DocTemplate (или где бы вы ни создавали свои фреймы)
CHostedMultiDocTemplate :: OpenDocumentFile:
CDocument* pDocument = CreateNewDocument();
// the following is just for demo purposes. Use your own mechanism
m_MyWpfShellOrSomething->PleaseCreateAHostedWindowUsing(&CreateHostedFrame);
InitialUpdateFrame(pFrame, pDocument, bMakeVisible);
return pDocument;
Ваш CMDIChildWnd
-приобретенный класс, вероятно, захочет переопределить все, что относится к родительскому фрейму MDI (найдите в источнике MFC CMDIChildWnd
MDIParent()
или что-то в этом роде).
Конечно, последний шаг - обновить ваш метод CMyApp :: OnInitInstance (), чтобы использовать ваш специализированный шаблон MultiDoc и дочерний фрейм вместо других.