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 <afxwinforms.h>
のステートメントの末尾で、 を pch.h (Visual Studio 2017 以前では#include
) に追加します。CDialog
をサブクラスとして持つ新しいクラスを追加します。プロジェクト名を右クリックし、
CHostForWinForm
サブクラス化する MFC クラス (CDialog
と呼ばれます) を追加します。 ダイアログ ボックスのリソースは不要なので、リソース ID を削除できます ([リソース ビュー] を選択し、[ダイアログ] フォルダーを展開して、IDD_HOSTFORWINFORM
リソースを削除します。次に、コード内のこの ID への参照を削除します。CDialog
ファイルとCHostForWinForm.h
ファイルのCHostForWinForm.cpp
をCWinFormsDialog<WindowsControlLibrary1::UserControl1>
に置き換えます。DoModal
クラスでCHostForWinForm
を呼び出します。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();
OnInitDialog
(CHostForWinForm.cpp
) を次のように定義します。BOOL CHostForWinForm::OnInitDialog() { CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog(); GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1); return TRUE; }
次に、
OnButton1
ハンドラーを追加します。CHostForWinForm
のCHostForWinForm.h
クラスのパブリック セクションに次の行を追加します。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
のCHostForWinForm.h
クラスの public セクションに、次の宣言を追加します。CString m_sEditBoxOnWinForm;
DoDataExchange
のCHostForWinForm.cpp
の定義で、関数の末尾に次の 4 行を追加します。if (pDX->m_bSaveAndValidate) m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text); else GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
OnButton1
のCHostForWinForm.cpp
の定義で、関数の末尾に次の 3 行を追加します。this->UpdateData(TRUE); System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm); System::Windows::Forms::MessageBox::Show(z);
プロジェクトをビルドして実行します。
関連項目
System.Windows.Forms.UserControl
MFC での Windows フォーム ユーザー コントロールの使用