17

ここで自分の質問に答えます。これをつなぎ合わせるのに数時間を費やし、見つけたものを共有して、他の誰かを掘り下げないようにしたかったからです。

ほとんどの方法を説明するMSDN ウォークスルーがありますが、他の場所で見つけた重要な部分がいくつかあります。たとえば、ウォークスルーでは、_tWinMain() 定義の前に [System::STAThreadAttribute] 行を配置するように指示されていますが、標準の MFC アプリケーションを実装している場合は、ソース コードに _tWinMain() がありません。

ここで不明な点がある場合は、お気軽に質問してください。回答を編集して、より明確にします。

4

1 に答える 1

23

手順 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 コンポーネントのプロパティとメソッドにアクセスできるようになりました。

于 2009-05-06T14:43:36.950 に答える