MFC ダイアログ ボックスとしての Windows フォーム ユーザー コントロールのホスト
MFC に用意されている CWinFormsDialog テンプレート クラスを使用すると、モーダルまたはモードレスの MFC ダイアログ ボックスにある Windows フォーム ユーザー コントロール (UserControl) をホストできます。CWinFormsDialog は、CDialog MFC クラスから派生しているため、ダイアログ ボックスをモーダルまたはモードレスとして起動できます。
CWinFormsDialog でユーザー コントロールをホストするために使用する処理は、「MFC ダイアログ ボックスにおける Windows フォーム ユーザー コントロールのホスト」で説明する処理に似ています。ただし、CWinFormsDialog は、ユーザー コントロールの初期化およびホストを管理するため、手動でプログラムを作成する必要はありません。
示すサンプル アプリケーションについては Windows フォームは、MFC と、" MFC Windows フォームとの統合使用しました。
MFC ホスト アプリケーションを作成するには
新しい MFC アプリケーション プロジェクトを作成します。
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。[Visual C++] フォルダーの [MFC アプリケーション] をクリックします。
[名前] ボックスに、MFC03 を入力し、**[ソリューションに追加]ソリューションの設定をに変更します。[OK]**をクリックします。
MFC アプリケーション ウィザードで、すべての既定値をそのまま使用し、[完了] をクリックします。これにより、マルチ ドキュメント インターフェイスを持つ MFC アプリケーションが作成されます。
プロジェクトを構成します。
ソリューション エクスプローラーで、MFC03 プロジェクトのノードを右クリックし、コンテキスト メニューの [プロパティ] をクリックします。[プロパティ ページ] ダイアログ ボックスが表示されます。
[プロパティ ページ] ダイアログ ボックスの [構成プロパティ] ツリー コントロールの [全般] を選択し、次に [プロジェクトの既定値] ボックスの [共通言語ランタイム サポート] を [共通言語ランタイム サポート (/clr)] に設定します。[OK] をクリックします。
.NET コントロールへの参照を追加します。
ソリューション エクスプローラーで、MFC03 プロジェクトのノードを右クリックし、[参照] をクリックします。[プロパティ ページ] の [新しい参照の追加] をクリックし、WindowsControlLibrary1 ([プロジェクト] タブ) を選択して [OK] をクリックします。これによって、プログラムをコンパイルするために、参照が /FU コンパイラ オプションの形式で追加されます。また、プログラムを実行するために、WindowsControlLibrary1.dll が MFC03 プロジェクト ディレクトリにコピーされます。
stdafx.h の既存の #include ステートメントの最後に #include <afxwinforms.h> を追加します。
CDialog をサブクラスとして持つ新しいクラスを追加します。
プロジェクト名を右クリックし、CDialog をサブクラスとして持つ (CHostForWinForm という名前の) MFC クラスを追加します。ダイアログ ボックスのリソースは不要なので、リソース ID を削除できます。この操作を行うには、[リソース ビュー] を選択し、[ダイアログ] フォルダーを展開して、IDD_HOSTFORWINFORM リソースを削除します。次に、コード内のこの ID への参照を削除します。
CHostForWinForm.h ファイルと CHostForWinForm.cpp ファイル内にある CDialog を CWinFormsDialog<WindowsControlLibrary1::UserControl1> に置き換えます。
CHostForWinForm クラスで DoModal を呼び出します。
MFC03.cpp で、#include "HostForWinForm.h" を追加します。
CMFC03App::InitInstance の定義内の return ステートメントの前に、次のコードを追加します。
CHostForWinForm m_HostForWinForm;
m_HostForWinForm.DoModal();
プロジェクトをビルドして実行します。
[ビルド] メニューの [ソリューションのビルド] をクリックします。
[デバッグ] メニューの [デバッグなしで開始] をクリックします。
次に、MFC アプリケーションから Windows フォーム上のコントロールの状態を監視するコードを追加します。
OnInitDialog のハンドラーを追加します。
[プロパティ] ウィンドウを表示します (F4 キーを押します)。クラス ビューで、CHostForWinForm を選択します。[プロパティ] ウィンドウで、オーバーライドを選択します。OnInitDialog の行で、左側の列をクリックして [<追加>] をクリックします。これにより、次の行が CHostForWinForm.h に追加されます。
virtual BOOL OnInitDialog();
CHostForWinForm.cpp で、OnInitDialog を次のように定義します。
BOOL CHostForWinForm::OnInitDialog() { CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog(); GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1); return TRUE; }
次に、OnButton1 ハンドラーを追加します。CHostForWinForm.h 内の CHostForWinForm クラスのパブリック セクションに次の行を追加します。
virtual void OnButton1( System::Object^ sender, System::EventArgs^ e ); BEGIN_DELEGATE_MAP( CHostForWinForm ) EVENT_DELEGATE_ENTRY( OnButton1, System::Object^, System::EventArgs^ ); END_DELEGATE_MAP()
CHostForWinForm.cpp で、次の定義を追加します。
void CHostForWinForm::OnButton1( System::Object^ sender, System::EventArgs^ e ) { System::Windows::Forms::MessageBox::Show("test"); }
プロジェクトをビルドして実行します。Windows フォーム上のボタンをクリックすると、MFC アプリケーション内のコードが実行されます。
次に、MFC コードから Windows フォーム上のテキスト ボックスの値を表示するコードを追加します。
CHostForWinForm.h 内の CHostForWinForm クラスのパブリック セクションに、次の宣言を追加します。
CString m_sEditBoxOnWinForm;
CHostForWinForm.cpp 内の DoDataExchange の定義で、関数の最後に次の 3 行を追加します。
if (pDX->m_bSaveAndValidate) m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text); else GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
CHostForWinForm.cpp 内の OnButton1 の定義で、関数の最後に次の 3 行を追加します。
this->UpdateData(TRUE); System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm); System::Windows::Forms::MessageBox::Show(z);
プロジェクトをビルドして実行します。
参照
関連項目
System.Windows.Forms.UserControl