Hébergement d'un contrôle utilisateur Windows Form en tant que boîte de dialogue MFC
MFC fournit la classe de modèle CWinFormsDialog pour pouvoir héberger un contrôle utilisateur Windows Forms (UserControl) dans une boîte de dialogue MFC modale ou sans mode. CWinFormsDialog
est dérivé de la classe MFC CDialog, de sorte que la boîte de dialogue peut être lancée en tant que modal ou sans mode.
Le processus qui CWinFormsDialog
utilise pour héberger le contrôle utilisateur est similaire à celui décrit dans l’hébergement d’un contrôle utilisateur Windows Form dans une boîte de dialogue MFC. Toutefois, CWinFormsDialog
gère l’initialisation et l’hébergement du contrôle utilisateur afin qu’il ne soit pas obligé d’être programmé manuellement.
Pour créer l’application hôte MFC
Créez un projet d’application MFC.
Dans le menu Fichier , sélectionnez Nouveau, puis cliquez sur Projet. Dans le dossier Visual C++ , sélectionnez Application MFC.
Dans la zone Nom , entrez et modifiez
MFC03
le paramètre Solution pour ajouter à la solution. Cliquez sur OK.Dans l’Assistant Application MFC, acceptez toutes les valeurs par défaut, puis cliquez sur Terminer. Cela crée une application MFC avec une interface de document multiple.
Configurez le projet.
Dans Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet MFC03, puis choisissez Propriétés. La boîte de dialogue Pages de propriétés s’affiche.
Dans la boîte de dialogue Pages de propriétés, sélectionnez Propriétés>générales de configuration. Dans la section Project Defaults, définissez la prise en charge du Common Language Runtime sur Common Language Runtime Support (/clr). Choisissez OK.
Ajoutez une référence au contrôle .NET.
Dans Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet MFC03, puis choisissez Ajouter, Références. Dans la page De propriétés, cliquez sur Ajouter une nouvelle référence, sélectionnez WindowsControlLibrary1 (sous l’onglet Projets ), puis cliquez sur OK. Cela ajoute une référence sous la forme d’une option de compilateur /FU afin que le programme compile ; il copie également WindowsControlLibrary1.dll dans le répertoire du
MFC03
projet afin que le programme s’exécute.Ajoutez
#include <afxwinforms.h>
à pch.h (stdafx.h dans Visual Studio 2017 et versions antérieures), à la fin des instructions existantes#include
.Ajoutez une nouvelle classe qui sous-classe
CDialog
.Cliquez avec le bouton droit sur le nom du projet et ajoutez une classe MFC (appelée CHostForWinForm) qui sous-classe
CDialog
. Étant donné que vous n’avez pas besoin de la ressource de boîte de dialogue, vous pouvez supprimer l’ID de ressource (sélectionnez Affichage des ressources, développez le dossier Boîte de dialogue et supprimezIDD_HOSTFORWINFORM
la ressource. Ensuite, supprimez les références à l’ID dans le code.).Remplacez
CDialog
les fichiersCWinFormsDialog<WindowsControlLibrary1::UserControl1>
CHostForWinForm.h et CHostForWinForm.cpp par .Appelez DoModal sur la classe CHostForWinForm.
Dans MFC03.cpp, ajoutez
#include "HostForWinForm.h"
.Avant l’instruction return dans la définition de CMFC03App ::InitInstance, ajoutez :
CHostForWinForm m_HostForWinForm; m_HostForWinForm.DoModal();
Générez et exécutez le projet.
Dans le menu Générer, cliquez sur Générer la solution.
Dans le menu Débogage , cliquez sur Démarrer sans débogage.
Ensuite, vous allez ajouter du code pour surveiller l’état d’un contrôle sur les Windows Forms à partir de l’application MFC.
Ajoutez un gestionnaire pour OnInitDialog.
Affichez la fenêtre Propriétés (F4). En mode Classe, sélectionnez CHostForWinForm. Dans la fenêtre Propriétés , sélectionnez remplacements et dans la ligne pour OnInitDialog, cliquez dans la colonne de gauche et sélectionnez < Ajouter >. Cela ajoute la ligne suivante à CHostForWinForm.h :
virtual BOOL OnInitDialog();
Définissez OnInitDialog (dans CHostForWinForm.cpp) comme suit :
BOOL CHostForWinForm::OnInitDialog() { CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog(); GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1); return TRUE; }
Ajoutez ensuite le gestionnaire OnButton1. Ajoutez les lignes suivantes à la section publique de la classe CHostForWinForm dans 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()
Dans CHostForWinForm.cpp, ajoutez cette définition :
void CHostForWinForm::OnButton1( System::Object^ sender, System::EventArgs^ e ) { System::Windows::Forms::MessageBox::Show("test"); }
Générez et exécutez le projet. Lorsque vous cliquez sur le bouton, qui se trouve sur windows Form, le code de l’application MFC s’exécute.
Ensuite, vous allez ajouter du code à afficher à partir du code MFC la valeur dans la zone de texte du Windows Form.
Dans la section publique de la classe CHostForWinForm dans CHostForWinForm.h, ajoutez la déclaration suivante :
CString m_sEditBoxOnWinForm;
Dans la définition de DoDataExchange dans CHostForWinForm.cpp, ajoutez les trois lignes suivantes à la fin de la fonction :
if (pDX->m_bSaveAndValidate) m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text); else GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
Dans la définition de OnButton1 dans CHostForWinForm.cpp, ajoutez les trois lignes suivantes à la fin de la fonction :
this->UpdateData(TRUE); System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm); System::Windows::Forms::MessageBox::Show(z);
Générez et exécutez le projet.
Voir aussi
System.Windows.Forms.UserControlUtilisation d’un contrôle utilisateur Windows Form dans MFC