Hosten eines Windows Form-Benutzersteuerelements als MFC-Dialogfeld

MFC stellt die Vorlagenklasse CWinFormsDialog bereit, damit Sie ein Windows Forms-Benutzersteuerelement (UserControl) in einem modalem oder moduslosen MFC-Dialogfeld hosten können. CWinFormsDialog wird von der MFC-Klasse CDialog abgeleitet, sodass das Dialogfeld als modal oder moduslos gestartet werden kann.

Der Prozess, CWinFormsDialog der zum Hosten des Benutzersteuerelements verwendet wird, ähnelt dem verfahren, das unter Hosten eines Windows Form-Benutzersteuerelements in einem MFC-Dialogfeld beschrieben ist. CWinFormsDialog verwaltet jedoch die Initialisierung und das Hosten des Benutzersteuerelements, sodass es nicht manuell programmiert werden muss.

So erstellen Sie die MFC-Hostanwendung

  1. Erstellen Sie ein MFC-Anwendungsprojekt.

    Wählen Sie im Menü "Datei " die Option "Neu" aus, und klicken Sie dann auf "Projekt". Wählen Sie im Ordner "Visual C++" die Option "MFC-Anwendung" aus.

    Geben Sie MFC03 im Feld "Name" die Einstellung "Lösung hinzufügen" ein, und ändern Sie sie in "Lösung hinzufügen". Klicken Sie auf "OK".

    Übernehmen Sie im MFC-Anwendungs-Assistenten alle Standardwerte, und klicken Sie dann auf "Fertig stellen". Dies erstellt eine MFC-Anwendung mit einem MDI (Multiple Document Interface).

  2. Konfigurieren des Projekts.

    Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf den MFC03-Projektknoten, und wählen Sie "Eigenschaften" aus. Das Dialogfeld "Eigenschaftenseiten " wird angezeigt.

    Wählen Sie im Dialogfeld "Eigenschaftenseiten" die Option "Konfigurationseigenschaften>allgemein" aus. Legen Sie im Abschnitt "Project Defaults" die Unterstützung der Common Language Runtime auf den Support für Common Language Runtime (/clr) fest. Wählen Sie OK aus.

  3. Fügen Sie dem .NET-Steuerelement einen Verweis hinzu.

    Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf den MFC03-Projektknoten, und wählen Sie "Hinzufügen", "Verweise" aus. Klicken Sie auf der Eigenschaftenseite auf " Neuen Verweis hinzufügen", wählen Sie "WindowsControlLibrary1" (unter der Registerkarte "Projekte ") aus, und klicken Sie auf "OK". Dadurch wird ein Verweis in Form einer /FU-Compileroption hinzugefügt, sodass das Programm kompiliert wird. Außerdem kopiert es WindowsControlLibrary1.dll in das MFC03 Projektverzeichnis, sodass das Programm ausgeführt wird.

  4. Fügen Sie #include <afxwinforms.h> zu pch.h (stdafx.h in Visual Studio 2017 und früher) am Ende der vorhandenen #include Anweisungen hinzu.

  5. Fügen Sie eine neue Klasse hinzu, die CDialog als Unterklasse verwendet.

    Klicken Sie mit der rechten Maustaste auf den Projektnamen, und fügen Sie eine MFC-Klasse mit dem Namen CHostForWinForm hinzu, die CDialog als Unterklasse verwendet. Da Sie die Dialogfeldressource nicht benötigen, können Sie die Ressourcen-ID löschen (Wählen Sie "Ressourcenansicht" aus, erweitern Sie den Dialogfeldordner, und löschen IDD_HOSTFORWINFORM Sie die Ressource. Entfernen Sie dann alle Verweise auf die ID im Code.)

  6. Ersetzen Sie in den Dateien CHostForWinForm.h und CHostForWinForm.cpp CDialog durch CWinFormsDialog<WindowsControlLibrary1::UserControl1>.

  7. Rufen Sie in der CHostForWinForm-Klasse DoModal auf.

    Fügen Sie in der Datei MFC03.cpp die Zeichenfolge #include "HostForWinForm.h" hinzu.

    Fügen Sie in der Definition von CMFC03App::InitInstance vor der return-Anweisung Folgendes hinzu:

    CHostForWinForm m_HostForWinForm;
    m_HostForWinForm.DoModal();
    
  8. Erstellen Sie das Projekt, und führen Sie es aus.

    Klicken Sie im Menü Erstellen auf Projektmappe erstellen.

    Klicken Sie im Menü "Debuggen " auf "Start" ohne Debugging.

    Als Nächstes fügen Sie Code zum Überwachen des Zustands eines Steuerelements in den Windows Forms aus der MFC-Anwendung hinzu.

  9. Fügen Sie einen Handler für OnInitDialog hinzu.

    Anzeigen des Eigenschaftenfensters (F4). Wählen Sie in der Klassenansicht CHostForWinForm aus. Wählen Sie im Eigenschaftenfenster Außerkraftsetzungen aus, und klicken Sie in der Zeile für "OnInitDialog" in der linken Spalte, und wählen Sie "Hinzufügen" >aus<. Dadurch wird in CHostForWinForm.h die folgende Zeile hinzugefügt:

    virtual BOOL OnInitDialog();
    
  10. Definieren Sie OnInitDialog (in CHostForWinForm.cpp) wie folgt:

    BOOL CHostForWinForm::OnInitDialog() {
       CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog();
       GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1);
       return TRUE;
    }
    
  11. Fügen Sie anschließend den OnButton1-Handler hinzu. Fügen Sie dem öffentlichen Abschnitt der CHostForWinForm-Klasse in CHostForWinForm.h die folgenden Zeilen hinzu:

    virtual void OnButton1( System::Object^ sender, System::EventArgs^ e );
    
    BEGIN_DELEGATE_MAP( CHostForWinForm )
       EVENT_DELEGATE_ENTRY( OnButton1, System::Object^, System::EventArgs^ );
    END_DELEGATE_MAP()
    

    Fügen Sie in CHostForWinForm.cpp die folgende Definition hinzu:

    void CHostForWinForm::OnButton1( System::Object^ sender, System::EventArgs^ e )
    {
       System::Windows::Forms::MessageBox::Show("test");
    }
    
  12. Erstellen Sie das Projekt, und führen Sie es aus. Wenn Sie auf die Schaltfläche klicken, die sich im Windows Form befindet, wird der Code in der MFC-Anwendung ausgeführt.

    Als Nächstes fügen Sie Code hinzu, mit dem der Wert aus dem MFC-Code im Textfeld des Windows Forms angezeigt wird.

  13. Fügen Sie in CHostForWinForm.h im öffentlichen Abschnitt der CHostForWinForm-Klasse die folgende Deklaration hinzu:

    CString m_sEditBoxOnWinForm;
    
  14. Fügen Sie in der Definition von DoDataExchange in CHostForWinForm.cpp am Ende der Funktion die folgenden drei Zeilen hinzu:

    if (pDX->m_bSaveAndValidate)
       m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text);
    else
       GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
    
  15. Fügen Sie in der Definition von OnButton1 in CHostForWinForm.cpp am Ende der Funktion die folgenden drei Zeilen hinzu:

    this->UpdateData(TRUE);
    System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm);
    System::Windows::Forms::MessageBox::Show(z);
    
  16. Erstellen Sie das Projekt, und führen Sie es aus.

Siehe auch

System.Windows.Forms.UserControlVerwenden eines Windows Form-Benutzersteuerelements in MFC