Вы можете передавать внутренние индексы и flatMap
на каждый внешний массив:
IntStream.range(0, arr[0].length)
.flatMap(i -> Arrays.stream(arr).mapToInt(a -> a[i]))
.toArray()
Шаг 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.