手順 1: CLR サポートを使用してコンパイルするように MFC アプリケーションを構成する
ネイティブ C++ とマネージド .NET コード間の相互運用性を実現する最善の方法は、アプリケーションをネイティブ C++ ではなくマネージド C++ としてコンパイルすることです。これは、プロジェクトの構成プロパティに移動することによって行われます。一般の下に、「共通言語ランタイムのサポート」オプションがあります。これを「共通言語ランタイム サポート /clr」に設定します。
手順 2: WPF アセンブリをプロジェクトに追加する
ソリューション エクスプローラーでプロジェクトを右クリックし、[参照] を選択します。「新しい参照を追加」をクリックします。.NET タブで、WindowsBase、PresentationCore、PresentationFramework、および System を追加します。それらがピックアップされるように、参照を追加した後にすべてを再構築してください。
手順 3: MFC アプリケーションで STAThreadAttribute を設定する
WPF では、メイン UI スレッドで STAThreadAttribute を設定する必要があります。プロジェクトの構成プロパティに移動して、これを設定します。Linker->Advanced の下に、「CLR Thread Attribute」というオプションがあります。これを「STA スレッド属性」に設定します。
手順 4: HwndSource のインスタンスを作成して WPF コンポーネントをラップする
System::Windows::Interop::HwndSource は、MFC と .NET コンポーネント間の相互作用を処理する .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;
これで、m_webBrowser を介して WPF コンポーネントのプロパティとメソッドにアクセスできるようになりました。