Hosting di un controllo utente Windows Form come finestra di dialogo MFC
MFC fornisce la classe modello CWinFormsDialog in modo da poter ospitare un controllo utente Windows Form (UserControl) in una finestra di dialogo MFC modale o modeless. CWinFormsDialog
deriva dalla classe MFC CDialog, quindi la finestra di dialogo può essere avviata come modale o non modale.
Il processo utilizzato CWinFormsDialog
per ospitare il controllo utente è simile a quello descritto in Hosting di un controllo utente di Windows Form in una finestra di dialogo MFC. Tuttavia, CWinFormsDialog
gestisce l'inizializzazione e l'hosting del controllo utente in modo che non sia necessario programmare manualmente.
Per creare l'applicazione host MFC
Creare un progetto di applicazione MFC.
Scegliere Nuovo dal menu File e quindi fare clic su Progetto. Nella cartella Visual C++ selezionare Applicazione MFC.
Nella casella Nome immettere
MFC03
e modificare l'impostazione Soluzione in Aggiungi alla soluzione. Fare clic su OK.Nella Creazione guidata applicazione MFC accettare tutte le impostazioni predefinite e quindi fare clic su Fine. Verrà creata un'applicazione MFC con un'interfaccia a documenti multipli.
Configurare il progetto.
In Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto MFC03 e scegliere Proprietà. Verrà visualizzata la finestra di dialogo Pagine delle proprietà.
Nella finestra di dialogo Pagine delle proprietà selezionare Proprietà>di configurazione Generale. Nella sezione Project Defaults (Impostazioni predefinite progetto) impostare Common Language Runtime support (/clr) su Common Language Runtime Support (/clr).In the Project Defaults section, set Common Language Runtime support to Common Language Runtime Support (/clr). Scegliere OK.
Aggiungere un riferimento al controllo .NET.
In Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto MFC03 e scegliere Aggiungi, Riferimenti. Nella pagina delle proprietà fare clic su Aggiungi nuovo riferimento, selezionare WindowsControlLibrary1 (nella scheda Progetti) e fare clic su OK. In questo modo viene aggiunto un riferimento sotto forma di opzione del compilatore /FU in modo che il programma venga compilato, copia anche WindowsControlLibrary1.dll nella directory del
MFC03
progetto in modo che il programma venga eseguito.Aggiungere
#include <afxwinforms.h>
a pch.h (stdafx.h in Visual Studio 2017 e versioni precedenti), alla fine delle istruzioni esistenti#include
.Aggiungere una nuova classe che sottoclassi
CDialog
.Fare clic con il pulsante destro del mouse sul nome del progetto e aggiungere una classe MFC (denominata CHostForWinForm) che sottoclassi
CDialog
. Poiché non è necessaria la risorsa della finestra di dialogo, è possibile eliminare l'ID risorsa (selezionare Visualizzazione risorse, espandere la cartella Dialog ed eliminareIDD_HOSTFORWINFORM
la risorsa. Rimuovere quindi tutti i riferimenti all'ID nel codice.Sostituire
CDialog
in CHostForWinForm.h e CHostForWinForm.cpp file conCWinFormsDialog<WindowsControlLibrary1::UserControl1>
.Chiamare DoModal nella classe CHostForWinForm.
In MFC03.cpp aggiungere
#include "HostForWinForm.h"
.Prima dell'istruzione return nella definizione di CMFC03App::InitInstance, aggiungere:
CHostForWinForm m_HostForWinForm; m_HostForWinForm.DoModal();
Compilare ed eseguire il progetto.
Nel menu Compila scegliere Compila soluzione.
Scegliere Avvia senza eseguire il debug dal menu Debug.
Successivamente si aggiungerà il codice per monitorare lo stato di un controllo nel Windows Form dall'applicazione MFC.
Aggiungere un gestore per OnInitDialog.
Visualizzare la finestra Proprietà (F4). In Visualizzazione classi selezionare CHostForWinForm. Nella finestra Proprietà selezionare sostituzioni e nella riga per OnInitDialog fare clic nella colonna a sinistra e selezionare < Aggiungi >. Viene aggiunta la riga seguente a CHostForWinForm.h:
virtual BOOL OnInitDialog();
Definire OnInitDialog (in CHostForWinForm.cpp) come segue:
BOOL CHostForWinForm::OnInitDialog() { CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog(); GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1); return TRUE; }
Aggiungere quindi il gestore OnButton1. Aggiungere le righe seguenti alla sezione pubblica della classe CHostForWinForm in 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()
In CHostForWinForm.cpp aggiungere questa definizione:
void CHostForWinForm::OnButton1( System::Object^ sender, System::EventArgs^ e ) { System::Windows::Forms::MessageBox::Show("test"); }
Compilare ed eseguire il progetto. Quando si fa clic sul pulsante , che si trova in Windows Form, il codice nell'applicazione MFC verrà eseguito.
Successivamente si aggiungerà il codice da visualizzare dal codice MFC il valore nella casella di testo in Windows Form.
Nella sezione pubblica della classe CHostForWinForm in CHostForWinForm.h aggiungere la dichiarazione seguente:
CString m_sEditBoxOnWinForm;
Nella definizione di DoDataExchange in CHostForWinForm.cpp aggiungere le tre righe seguenti alla fine della funzione:
if (pDX->m_bSaveAndValidate) m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text); else GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
Nella definizione di OnButton1 in CHostForWinForm.cpp aggiungere le tre righe seguenti alla fine della funzione:
this->UpdateData(TRUE); System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm); System::Windows::Forms::MessageBox::Show(z);
Compilare ed eseguire il progetto.
Vedi anche
System.Windows.Forms.UserControlUso di un controllo utente Windows Form in MFC