2009-05-06 20 views
16

私はここで自分の質問に答えるつもりです。なぜなら、私は数時間をかけて一緒につなぎ、私が他の誰かを掘削するのを救うという希望で私が見つけたものを分かち合いたいと思ったからです。MFCアプリケーションでWPFコンテンツをホストするにはどうすればよいですか?

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

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

答えて

22

ステップ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を通して。

+0

非常にいいです。投稿していただきありがとうございます。 – Gishu

+1

source-> SizeToContent = System :: Windows :: SizeToContent :: WidthAndHeight;これは私が逃したものでした! +1 –

+2

追加の情報は、StaThreadModelを設定しないと、MFC内でかなり不思議なほどにクラッシュします。そして、実行可能な主アプリでスレッドモデルを設定する必要があります。私のように、別のDLLで置き換えたいダイアログがあった場合、CLRスレッド属性をuncluded DLLに設定すると**役立たないでしょう**。それは他の人には明らかかもしれませんが、私にとってはそうではありませんでした。 – Dervall

関連する問題