Dela via


Använda en Windows Forms-användarkontroll som en MFC-dialogruta

MFC tillhandahåller mallklassen CWinFormsDialog så att du kan använda en Windows Forms-användarkontroll (UserControl) i en modal eller icke-modal MFC-dialogruta. CWinFormsDialog härleds från MFC-klassen CDialog, så dialogrutan kan startas antingen som modal eller icke-modalt.

Den process som CWinFormsDialog använder för att vara värd för användarkontrollen liknar den som beskrivs i Värd för en Användarkontroll för Windows-formulär i en MFC-dialogruta. Däremot hanterar CWinFormsDialog initiering av och värdskap för användarkontrollen så att den inte behöver programmeras manuellt.

Att skapa MFC-värdprogrammet

  1. Skapa ett MFC-programprojekt.

    Arkiv-menyn väljer du Nytt och klickar sedan på Projekt. I mappen Visual C++ väljer du MFC-program.

    I rutan Namn anger du MFC03 och ändrar inställningen för Lösning till Lägg till i lösning. Klicka på OK.

    I MFC-programguiden godkänner du alla standardvärden och klickar sedan på Slutför. Detta skapar ett MFC-program med ett gränssnitt för flera dokument.

  2. Konfigurera projektet.

    Högerklicka på MFC03-projektnoden i Solution Explorer och välj Egenskaper. Dialogrutan Egenskapssidor visas.

    I dialogrutan Egenskapssidor väljer du Konfigurationsegenskaper>Allmänt. I avsnittet Project Defaults anger du Stöd för Common Language Runtime till Common Language Runtime Support (/clr). Välj OK.

  3. Lägg till en referens till .NET-kontrollen.

    Högerklicka på MFC03-projektnoden i Solution Explorer och välj Lägg tillreferenser. På egenskapssidan klickar du på Lägg till ny referens, väljer WindowsControlLibrary1 (under fliken Projekt) och klickar på OK. Detta lägger till en referens i form av ett /FU kompilatoralternativ så att programmet kompileras. Det kopieras WindowsControlLibrary1.dll också till projektkatalogen MFC03 så att programmet körs.

  4. Lägg till #include <afxwinforms.h> till pch.h (stdafx.h i Visual Studio 2017 och tidigare) i slutet av de befintliga #include satserna.

  5. Lägg till en ny klass som subklassar CDialog.

    Högerklicka på projektnamnet och lägg till en MFC-klass som heter CHostForWinForm och subklassar CDialog. Eftersom du inte behöver dialogruteresursen kan du ta bort resurs-ID:t (välj Resursvy, expandera dialogrutan och ta bort IDD_HOSTFORWINFORM resursen. Ta sedan bort alla referenser till ID:t i koden.).

  6. Ersätt CDialog i CHostForWinForm.h och CHostForWinForm.cpp filer med CWinFormsDialog<WindowsControlLibrary1::UserControl1>.

  7. Anropa DoModal på klassen CHostForWinForm.

    I MFC03.cpplägger du till #include "HostForWinForm.h".

    Innan retursatsen i definitionen av CMFC03App::InitInstance lägger du till:

    CHostForWinForm m_HostForWinForm;
    m_HostForWinForm.DoModal();
    
  8. Skapa och kör projektet.

    Klicka på Skapa lösningSkapa-menyn.

    felsökningsmenyn klickar du på Starta utan att felsöka.

    Därefter lägger du till kod för att övervaka tillståndet för en kontroll i Windows Forms från MFC-programmet.

  9. Lägg till en hanterare för OnInitDialog.

    Visa fönstret Egenskaper (F4). I Klassvy väljer du CHostForWinForm. I fönstret Egenskaper väljer du åsidosättningar och i raden för OnInitDialogklickar du i den vänstra kolumnen och väljer < Lägg till >. Detta lägger till följande rad i CHostForWinForm.h:

    virtual BOOL OnInitDialog();
    
  10. Definiera OnInitDialog (i CHostForWinForm.cpp) enligt följande:

    BOOL CHostForWinForm::OnInitDialog() {
       CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog();
       GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1);
       return TRUE;
    }
    
  11. Lägg sedan till OnButton1 hanteraren. Lägg till följande rader i det offentliga avsnittet i CHostForWinForm klassen i 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()
    

    I CHostForWinForm.cpplägger du till den här definitionen:

    void CHostForWinForm::OnButton1( System::Object^ sender, System::EventArgs^ e )
    {
       System::Windows::Forms::MessageBox::Show("test");
    }
    
  12. Skapa och kör projektet. När du klickar på knappen, som finns i Windows-formuläret, körs koden i MFC-programmet.

    Därefter kommer du att lägga till kod i MFC-koden för att visa värdet i textrutan på Windows-formuläret.

  13. Lägg till följande deklaration i det offentliga avsnittet i CHostForWinForm klassen i CHostForWinForm.h:

    CString m_sEditBoxOnWinForm;
    
  14. I definitionen av DoDataExchange i CHostForWinForm.cpplägger du till följande fyra rader i slutet av funktionen:

    if (pDX->m_bSaveAndValidate)
       m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text);
    else
       GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
    
  15. I definitionen av OnButton1 i CHostForWinForm.cpplägger du till följande tre rader i slutet av funktionen:

    this->UpdateData(TRUE);
    System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm);
    System::Windows::Forms::MessageBox::Show(z);
    
  16. Skapa och kör projektet.

Se även

System.Windows.Forms.UserControl
Använda en Användarkontroll för Windows-formulär i MFC