次の方法で共有


MFC ダイアログ ボックスとしての Windows フォーム ユーザー コントロールのホスト

MFC にはテンプレート クラス CWinFormsDialog が用意されているため、モーダルまたはモードレス MFC ダイアログ ボックスで Windows フォーム ユーザー コントロール (UserControl) をホストできます。 CWinFormsDialog は MFC クラス CDialogから派生しているため、ダイアログ ボックスはモーダルまたはモードレスとして起動できます。

ユーザー コントロールをホストするために CWinFormsDialog 使用するプロセスは、「 MFC ダイアログ ボックスでの Windows フォーム ユーザー コントロールのホスト」で説明されているプロセスと似ています。 ただし、CWinFormsDialog は、ユーザー コントロールの初期化およびホストを管理するため、手動でプログラムを作成する必要はありません。

MFC ホスト アプリケーションを作成するには

  1. MFC アプリケーション プロジェクトを作成します。

    [ファイル] メニューで、[新規作成] を選択し、[プロジェクト] をクリックします。 [Visual C++] フォルダーで、[MFC アプリケーション] を選択します。

    [ 名前 ] ボックスに「 MFC03 」と入力し、[ソリューション] 設定を [ ソリューションに追加] に変更しますOK をクリックします。

    MFC アプリケーション ウィザードで、すべての既定値をそのまま使用し、[完了] をクリックします。 これにより、マルチ ドキュメント インターフェイスを持つ MFC アプリケーションが作成されます。

  2. プロジェクトを構成します。

    ソリューション エクスプローラーで、MFC03 プロジェクト ノードを右クリックし、[プロパティ] を選択します。 [プロパティ ページ] ダイアログ ボックスが表示されます。

    [プロパティ ページ] ダイアログで、[構成プロパティ]>[全般] を選択します。 [プロジェクトの既定値] セクションの [共通言語ランタイム サポート][共通言語ランタイム サポート (/clr)] に設定します。 OK を選択します。

  3. .NET コントロールへの参照を追加します。

    ソリューション エクスプローラーで、MFC03 プロジェクト ノードを右クリックし、[追加][参照] の順にクリックします。 [プロパティ ページ][新しい参照の追加] をクリックし、WindowsControlLibrary1 ([プロジェクト] タブ) を選択して [OK] をクリックします。 これにより、 /FU コンパイラ オプションの形式で参照が追加され、プログラムがコンパイルされます。また、 WindowsControlLibrary1.dllMFC03 プロジェクト ディレクトリにコピーされ、プログラムが実行されます。

  4. 既存 #include <afxwinforms.h> のステートメントの末尾で、pch.h (Visual Studio 2017 以前では #include) に追加します。

  5. CDialog をサブクラスとして持つ新しいクラスを追加します。

    プロジェクト名を右クリックし、CHostForWinFormサブクラス化する MFC クラス (CDialog と呼ばれます) を追加します。 ダイアログ ボックスのリソースは不要なので、リソース ID を削除できます ([リソース ビュー] を選択し、[ダイアログ] フォルダーを展開して、IDD_HOSTFORWINFORM リソースを削除します。次に、コード内のこの ID への参照を削除します。

  6. CDialogファイルとCHostForWinForm.hファイルのCHostForWinForm.cppCWinFormsDialog<WindowsControlLibrary1::UserControl1>に置き換えます。

  7. DoModal クラスでCHostForWinFormを呼び出します。

    MFC03.cppで、#include "HostForWinForm.h"を追加します。

    CMFC03App::InitInstanceの定義の return ステートメントの前に、次を追加します。

    CHostForWinForm m_HostForWinForm;
    m_HostForWinForm.DoModal();
    
  8. プロジェクトをビルドして実行します。

    [ビルド] メニューの [ソリューションのビルド] をクリックします。

    [デバッグ] メニューの [デバッグなしで開始] をクリックします。

    次に、MFC アプリケーションから Windows フォーム上のコントロールの状態を監視するコードを追加します。

  9. OnInitDialogのハンドラーを追加します。

    [プロパティ] ウィンドウを表示します (F4 キーを押します)。 クラス ビューでCHostForWinFormを選択します。 プロパティウィンドウでオーバーライドを選択し、OnInitDialogの行で、左側の列をクリックして<追加>を選択します。 これにより、次の行が CHostForWinForm.hに追加されます。

    virtual BOOL OnInitDialog();
    
  10. OnInitDialog (CHostForWinForm.cpp) を次のように定義します。

    BOOL CHostForWinForm::OnInitDialog() {
       CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog();
       GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1);
       return TRUE;
    }
    
  11. 次に、 OnButton1 ハンドラーを追加します。 CHostForWinFormCHostForWinForm.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");
    }
    
  12. プロジェクトをビルドして実行します。 Windows フォーム上のボタンをクリックすると、MFC アプリケーション内のコードが実行されます。

    次に、MFC コードから Windows フォーム上のテキスト ボックスの値を表示するコードを追加します。

  13. CHostForWinFormCHostForWinForm.h クラスの public セクションに、次の宣言を追加します。

    CString m_sEditBoxOnWinForm;
    
  14. DoDataExchangeCHostForWinForm.cppの定義で、関数の末尾に次の 4 行を追加します。

    if (pDX->m_bSaveAndValidate)
       m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text);
    else
       GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
    
  15. OnButton1CHostForWinForm.cppの定義で、関数の末尾に次の 3 行を追加します。

    this->UpdateData(TRUE);
    System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm);
    System::Windows::Forms::MessageBox::Show(z);
    
  16. プロジェクトをビルドして実行します。

関連項目

System.Windows.Forms.UserControl
MFC での Windows フォーム ユーザー コントロールの使用