MFC ダイアログ ボックスとしての Windows フォーム ユーザー コントロールのホスト
MFC に用意されている CWinFormsDialog テンプレート クラスを使用すると、モーダルまたはモードレスの MFC ダイアログ ボックスにある Windows フォーム ユーザー コントロール (UserControl) をホストできます。 CWinFormsDialog
は、MFC クラス CDialog から派生しているため、ダイアログ ボックスをモーダルまたはモードレスとして起動できます。
ユーザー コントロールをホストするために CWinFormsDialog
によって使用されるプロセスは、「MFC ダイアログ ボックスでの Windows フォーム ユーザー コントロールのホスト」で説明されているプロセスと似ています。 ただし、CWinFormsDialog
は、ユーザー コントロールの初期化およびホストを管理するため、手動でプログラムを作成する必要はありません。
MFC ホスト アプリケーションを作成するには
MFC アプリケーション プロジェクトを作成します。
[ファイル] メニューで、[新規作成] を選択し、[プロジェクト] をクリックします。 [Visual C++] フォルダーで、[MFC アプリケーション] を選択します。
[名前] ボックスに「
MFC03
」と入力し、[ソリューション] の設定を [ソリューションに追加] に変更します。[OK] をクリックします。MFC アプリケーション ウィザードで、すべての既定値をそのまま使用し、[完了] をクリックします。 これにより、マルチ ドキュメント インターフェイスを持つ MFC アプリケーションが作成されます。
プロジェクトを構成します。
ソリューション エクスプローラーで、MFC03 プロジェクト ノードを右クリックし、[プロパティ] を選択します。 [プロパティ ページ] ダイアログ ボックスが表示されます。
[プロパティ ページ] ダイアログで、[構成プロパティ]>[全般] を選択します。 [プロジェクトの既定値] セクションの [共通言語ランタイム サポート] を [共通言語ランタイム サポート (/clr)] に設定します。 OK を選択します。
.NET コントロールへの参照を追加します。
ソリューション エクスプローラーで、MFC03 プロジェクト ノードを右クリックし、[追加]、[参照] の順にクリックします。 [プロパティ ページ] の [新しい参照の追加] をクリックし、WindowsControlLibrary1 ([プロジェクト] タブ) を選択して [OK] をクリックします。 これによって、プログラムをコンパイルするために、参照が /FU コンパイラ オプションの形式で追加されます。また、プログラムを実行するために、WindowsControlLibrary1.dll が
MFC03
プロジェクト ディレクトリにコピーされます。既存
#include
のステートメントの末尾で、#include <afxwinforms.h>
を pch.h (Visual Studio 2017 以前では stdafx.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.UserControlMFC での Windows フォーム ユーザー コントロールの使用