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
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.
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.
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.Dodaj
#include <afxwinforms.h>
do pliku pch.h (stdafx.h w programie Visual Studio 2017 i starszym) na końcu istniejących#include
instrukcji.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.).Zastąp pliki
CDialog
CHostForWinForm.h i CHostForWinForm.cpp ciągiemCWinFormsDialog<WindowsControlLibrary1::UserControl1>
.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();
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.
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();
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; }
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"); }
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.
W publicznej sekcji klasy CHostForWinForm w CHostForWinForm.h dodaj następującą deklarację:
CString m_sEditBoxOnWinForm;
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);
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);
Skompiluj i uruchom projekt.
Zobacz też
System.Windows.Forms.UserControlUżywanie kontrolki użytkownika formularza systemu Windows w MFC