Udostępnij za pośrednictwem


Hostowanie kontrolki użytkownika formularza systemu Windows jako okna dialogowego MFC

MFC udostępnia klasę szablonu CWinFormsDialog , dzięki czemu można hostować kontrolkę użytkownika formularzy systemu Windows (UserControl) w modalnym lub moderowym oknie dialogowym MFC. CWinFormsDialog pochodzi z klasy MFC CDialog, więc okno dialogowe można uruchomić jako modalne lub moderowe.

Proces CWinFormsDialog używany do hostowania kontrolki użytkownika jest podobny do opisanego w temacie Hostowanie kontrolki użytkownika formularza systemu Windows w oknie dialogowym MFC. Zarządza jednak inicjowaniem i hostowaniem kontrolki użytkownika, CWinFormsDialog aby nie trzeba było programować ręcznie.

Aby utworzyć aplikację hosta MFC

  1. Utwórz projekt aplikacji MFC.

    W menu Plik wybierz pozycję Nowy, a następnie kliknij pozycję Projekt. W folderze Visual C++ wybierz pozycję Aplikacja MFC.

    W polu Nazwa wprowadź MFC03 i zmień ustawienie Rozwiązanie na Dodaj do rozwiązania. Kliknij przycisk OK.

    W Kreatorze aplikacji MFC zaakceptuj wszystkie wartości domyślne, a następnie kliknij przycisk Zakończ. Spowoduje to utworzenie aplikacji MFC z interfejsem wielu dokumentów.

  2. Skonfiguruj projekt.

    W Eksplorator rozwiązań kliknij prawym przyciskiem myszy węzeł projektu MFC03 i wybierz polecenie Właściwości. Zostanie wyświetlone okno dialogowe Strony właściwości.

    W oknie dialogowym Strony właściwości wybierz pozycję Właściwości>konfiguracji Ogólne. W sekcji Project Defaults (Ustawienia domyślne projektu) ustaw opcję Obsługa środowiska uruchomieniowego języka wspólnego na wartość Obsługa środowiska uruchomieniowego języka wspólnego (/clr).. Wybierz pozycję OK.

  3. Dodaj odwołanie do kontrolki .NET.

    W Eksplorator rozwiązań kliknij prawym przyciskiem myszy węzeł projektu MFC03 i wybierz polecenie Dodaj, odwołania. Na stronie właściwości kliknij pozycję Dodaj nowe odwołanie, wybierz pozycję WindowsControlLibrary1 (na karcie Projekty), a następnie kliknij przycisk OK. Spowoduje to dodanie odwołania w postaci /FU opcji kompilatora, tak aby program został skompilowany, a także kopiuje WindowsControlLibrary1.dll do MFC03 katalogu projektu, tak aby program został uruchomiony.

  4. Dodaj #include <afxwinforms.h> do pliku pch.h (stdafx.h w programie Visual Studio 2017 i starszym) na końcu istniejących #include instrukcji.

  5. Dodaj nową klasę, która klasy podrzędne CDialog.

    Kliknij prawym przyciskiem myszy nazwę projektu i dodaj klasę MFC (o nazwie CHostForWinForm), która podklasuje CDialog. Ponieważ nie potrzebujesz zasobu okna dialogowego, możesz usunąć identyfikator zasobu (wybierz pozycję Widok zasobu, rozwiń folder Okno dialogowe i usuń IDD_HOSTFORWINFORM zasób. Następnie usuń wszystkie odwołania do identyfikatora w kodzie.).

  6. Zastąp pliki CDialog CHostForWinForm.h i CHostForWinForm.cpp ciągiem CWinFormsDialog<WindowsControlLibrary1::UserControl1>.

  7. Wywołaj metodę DoModal w klasie CHostForWinForm.

    W MFC03.cpp dodaj element #include "HostForWinForm.h".

    Przed instrukcją return w definicji polecenia CMFC03App::InitInstance dodaj:

    CHostForWinForm m_HostForWinForm;
    m_HostForWinForm.DoModal();
    
  8. Skompiluj i uruchom projekt.

    W menu Kompilacja kliknij pozycję Kompiluj rozwiązanie.

    W menu Debugowanie kliknij przycisk Start bez debugowania.

    Następnie dodasz kod, aby monitorować stan kontrolki w formularzach systemu Windows z aplikacji MFC.

  9. Dodaj procedurę obsługi dla elementu OnInitDialog.

    Wyświetl okno Właściwości (F4). W widoku klasy wybierz pozycję CHostForWinForm. W oknie Właściwości wybierz przesłonięcia, a następnie w wierszu polecenia OnInitDialog kliknij w kolumnie po lewej stronie i wybierz pozycję < Dodaj >. Spowoduje to dodanie następującego wiersza do obiektu CHostForWinForm.h:

    virtual BOOL OnInitDialog();
    
  10. Zdefiniuj dziennik OnInitDialog (w CHostForWinForm.cpp) w następujący sposób:

    BOOL CHostForWinForm::OnInitDialog() {
       CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog();
       GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1);
       return TRUE;
    }
    
  11. Następnie dodaj procedurę obsługi OnButton1. Dodaj następujące wiersze do publicznej sekcji klasy CHostForWinForm w pliku 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()
    

    W CHostForWinForm.cpp dodaj następującą definicję:

    void CHostForWinForm::OnButton1( System::Object^ sender, System::EventArgs^ e )
    {
       System::Windows::Forms::MessageBox::Show("test");
    }
    
  12. Skompiluj i uruchom projekt. Po kliknięciu przycisku, który znajduje się w formularzu systemu Windows, zostanie uruchomiony kod w aplikacji MFC.

    Następnie dodasz kod do wyświetlenia z kodu MFC wartość w polu tekstowym w formularzu systemu Windows.

  13. W publicznej sekcji klasy CHostForWinForm w CHostForWinForm.h dodaj następującą deklarację:

    CString m_sEditBoxOnWinForm;
    
  14. W definicji funkcji DoDataExchange w CHostForWinForm.cpp dodaj następujące trzy wiersze na końcu funkcji:

    if (pDX->m_bSaveAndValidate)
       m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text);
    else
       GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
    
  15. W definicji elementu OnButton1 w CHostForWinForm.cpp dodaj następujące trzy wiersze na końcu funkcji:

    this->UpdateData(TRUE);
    System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm);
    System::Windows::Forms::MessageBox::Show(z);
    
  16. Skompiluj i uruchom projekt.

Zobacz też

System.Windows.Forms.UserControlUżywanie kontrolki użytkownika formularza systemu Windows w MFC