Как мое приложение WPF (w / MVVM, Prism) может взаимодействовать с монолитным приложением MFC? - PullRequest
1 голос
/ 21 декабря 2010

Я разрабатываю интерфейс WPF (с использованием MVVM и Prism) для существующего приложения MFC.Это приложение не будет существенно изменено, так как оно монолитное и не имеет какой-либо документации.Существуют ли какие-либо технологии, которые могут приводить эти две платформы в одно и то же пространство памяти (лучший вариант) или позволять им взаимодействовать синхронно (поскольку приложение MFC отнюдь не является поточно-ориентированным)?Чтобы поддерживать стабильность, мне нужно, чтобы WPF был исполняемым файлом.Я пытался подключить его как DLL к приложению MFC, но это приводит к крайней нестабильности.

1 Ответ

1 голос
/ 10 марта 2011

Один из вариантов, который у вас есть, - это непосредственно разместить свой 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 и дочерний фрейм вместо других.

...