ステップ1:CLRのサポート
でネイティブC++との相互運用性を実現するための最良の方法をコンパイルするMFCアプリケーションを設定し、.NETのマネージコード管理Cとしてアプリケーションをコンパイルする++ではなくネイティブC++よりもです。これは、プロジェクトの構成プロパティに移動することで実行されます。一般の下には、 "Common Language Runtime support"というオプションがあります。これを「Common Language Runtime Support/clr」に設定します。
ステップ2:
は、ソリューションエクスプローラでプロジェクトを右クリックし、「参照」を選択し、プロジェクトにWPFアセンブリを追加します。 [Add New Reference]をクリックします。 [.NET]タブで、WindowsBase、PresentationCore、PresentationFramework、およびSystemを追加します。参照を追加した後、必ずすべてをリビルドしてからピックアップするようにしてください。
ステップ3:MFCアプリケーション
にSTAThreadAttributeセットは、WPFはSTAThreadAttributeがメインUIスレッド上で設定されている必要があります。これを設定するには、プロジェクトの「構成プロパティー」に移動します。 Linker-> Advancedには、 "CLR Thread Attribute"というオプションがあります。これを「STAスレッド属性」に設定します。
ステップ4:WPFコンポーネント
システム:: WindowsのをラップするHwndSourceのインスタンスを作成します::相互運用:: 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)ソース - > Handle.ToPointer();
:: DestroyWindow(m_hWnd)を呼び出すまで、ソースオブジェクトと関連付けられているWPFコンテンツはそのまま残ります。
ステップ5:ブラウザの変数は後にスコープ外になりますので、WPFオブジェクト
への参照を保持:HwndSourceにWPFコントロールを追加します
System::Windows::Controls::WebBrowser^ browser = gcnew System::Windows::Controls::WebBrowser();
browser->Height = height;
browser->Width = width;
source->RootVisual = browser;
ステップ6ラッパー私たちは作成を行う関数を終了し、何らかの形で参照を保持する必要があります。管理対象オブジェクトは、管理されていないオブジェクトのメンバーになることはできませんが、gcrootというラッパー・テンプレートを使用してジョブを完了できます。
ダイアログクラスにメンバ変数を追加します。
#include <vcclr.h>
gcroot<System::Windows::Controls::WebBrowser^> m_webBrowser;
次にステップ5でコードに次の行を追加します。
m_webBrowser = browser;
今、私たちはWPFコンポーネントのプロパティとメソッドにアクセスすることができますm_webBrowserを通して。
非常にいいです。投稿していただきありがとうございます。 – Gishu
source-> SizeToContent = System :: Windows :: SizeToContent :: WidthAndHeight;これは私が逃したものでした! +1 –
追加の情報は、StaThreadModelを設定しないと、MFC内でかなり不思議なほどにクラッシュします。そして、実行可能な主アプリでスレッドモデルを設定する必要があります。私のように、別のDLLで置き換えたいダイアログがあった場合、CLRスレッド属性をuncluded DLLに設定すると**役立たないでしょう**。それは他の人には明らかかもしれませんが、私にとってはそうではありませんでした。 – Dervall