Как я размещаю содержание WPF в Приложениях MFC?

Вы можете передавать внутренние индексы и flatMap на каждый внешний массив:

IntStream.range(0, arr[0].length)
        .flatMap(i -> Arrays.stream(arr).mapToInt(a -> a[i]))
        .toArray()
17
задан 17 of 26 6 May 2009 в 14:50
поделиться

1 ответ

Шаг 1. Настройка приложения MFC для компиляции с поддержкой CLR

Лучший способ добиться совместимости между собственным C ++ и управляемым кодом .NET - это компилировать приложение как управляемый C ++, а не как собственный C ++. Это можно сделать, перейдя в Свойства конфигурации проекта. В разделе «Общие» есть опция «Common Language Runtime support». Установите для этого параметра «Common Language Runtime Support /clr".

Step 2: Добавьте сборки WPF в проект

Щелкните правой кнопкой мыши проект в обозревателе решений и выберите« Ссылки ». Нажмите «Добавить новую ссылку». На вкладке .NET добавьте WindowsBase, PresentationCore, PresentationFramework и System. Убедитесь, что вы перестроили все после добавления каких-либо ссылок, чтобы их можно было подобрать.

Шаг 3: Установите STAThreadAttribute в приложении MFC

WPF требует, чтобы STAThreadAttribute был установлен в основном потоке пользовательского интерфейса. Установите это, перейдя в Configuration Properties проекта. Под Linker-> Advanced есть опция под названием «Атрибут потока CLR». Установите для этого параметра «Атрибут потоков STA».

Шаг 4: Создайте экземпляр HwndSource для переноса компонента WPF

System :: Windows :: Interop :: HwndSource - это класс .NET, который обрабатывает взаимодействие между MFC и Компоненты .NET. Создайте его, используя следующий синтаксис:

System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew     System::Windows::Interop::HwndSourceParameters("MyWindowName");
sourceParams->PositionX = x;
sourceParams->PositionY = y;
sourceParams->ParentWindow = System::IntPtr(hWndParent);
sourceParams->WindowStyle = WS_VISIBLE | WS_CHILD;

System::Windows::Interop::HwndSource^ source = gcnew System::Windows::Interop::HwndSource(*sourceParams);
source->SizeToContent = System::Windows::SizeToContent::WidthAndHeight;

Добавьте переменную-член HWND в класс диалога, а затем назначьте ее следующим образом: Установите для этого параметра «Атрибут потоков STA».

Шаг 4: Создайте экземпляр HwndSource для переноса компонента WPF

System :: Windows :: Interop :: HwndSource - это класс .NET, который обрабатывает взаимодействие между MFC и Компоненты .NET. Создайте его, используя следующий синтаксис:

System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew     System::Windows::Interop::HwndSourceParameters("MyWindowName");
sourceParams->PositionX = x;
sourceParams->PositionY = y;
sourceParams->ParentWindow = System::IntPtr(hWndParent);
sourceParams->WindowStyle = WS_VISIBLE | WS_CHILD;

System::Windows::Interop::HwndSource^ source = gcnew System::Windows::Interop::HwndSource(*sourceParams);
source->SizeToContent = System::Windows::SizeToContent::WidthAndHeight;

Добавьте переменную-член HWND в класс диалога, а затем назначьте ее следующим образом: Установите для этого параметра «Атрибут потоков STA».

Шаг 4: Создайте экземпляр HwndSource для переноса компонента WPF

System :: Windows :: Interop :: HwndSource - это класс .NET, который обрабатывает взаимодействие между MFC и Компоненты .NET. Создайте его, используя следующий синтаксис:

System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew     System::Windows::Interop::HwndSourceParameters("MyWindowName");
sourceParams->PositionX = x;
sourceParams->PositionY = y;
sourceParams->ParentWindow = System::IntPtr(hWndParent);
sourceParams->WindowStyle = WS_VISIBLE | WS_CHILD;

System::Windows::Interop::HwndSource^ source = gcnew System::Windows::Interop::HwndSource(*sourceParams);
source->SizeToContent = System::Windows::SizeToContent::WidthAndHeight;

Добавьте переменную-член HWND в класс диалога, а затем назначьте ее следующим образом: m_hWnd = (HWND) source-> Handle.ToPointer ();

Исходный объект и связанный с ним контент WPF будут существовать до тех пор, пока вы не вызовете :: DestroyWindow (m_hWnd).

Шаг 5: Добавьте элемент управления WPF в обертка HwndSource

System::Windows::Controls::WebBrowser^ browser = gcnew System::Windows::Controls::WebBrowser();

browser->Height = height;
browser->Width = width;
source->RootVisual = browser;

Шаг 6. Сохранение ссылки на объект WPF

Поскольку переменная браузера выйдет из области видимости после того, как мы выйдем из функции, выполняющей создание, нам нужно каким-то образом сохранить ссылку на нее. Управляемые объекты не могут быть членами неуправляемых объектов, но вы можете использовать шаблон оболочки gcroot для выполнения работы.

Добавьте переменную-член в класс диалога:

#include <vcclr.h>
gcroot<System::Windows::Controls::WebBrowser^> m_webBrowser;

Затем добавьте следующую строку в код на шаге 5:

m_webBrowser = browser;

Теперь мы можем получить доступ к свойствам и методам компонента WPF через m_webBrowser.

23
ответ дан 30 November 2019 в 13:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: