Application Formulaire avec Visual C++ Présentation Squelette de l application Fenêtre Nous allons développer une application demandant 1 renseignement à une personne et affichant le résultat dans une zone de texte. La question sera la suivante : NOM de la personne, Nous supposerons que l utilisateur ne rentre pas de valeurs incohérentes. Un bouton validation permettra l affichage. Réalisation du squelette Tout d abord, créer un nouveau projet de type Dialog Based, se nommant Formulaire : File -> new puis sélectionner l onglet Projects et taper comme Project name : Formulaire enfin sélectionner MFC AppWizard (exe) puis valider par OK Bien choisir une application Dialog Based. A l étape 2 décocher l option about boxe. Ensuite valider les étapes une à une sans rien changer. On remarquera la création de deux classes : A l étape 4/4, faire Finish : Aller dans la fenêtre Workspace, regarder de manière détaillée le contenu de chacun des onglets : ClassView : RessourceView : FileView : #Niedercorn LT «la Briquerie» 57100 THIONVILLE Programmation Windows : Fenêtre & page 1/7
Réalisation de l interface graphique Mise en place des contrôles Ensuite, nous allons commencer par réaliser l interface graphique de saisie de l information de l utilisateur. Pour cela, dans la fenêtre Workspace, sélectionner l onglet RessourceView : Choisir Fenetre -> Dialog -> IDD_FENETRE_DIALOG, et double cliquer dessus. La zone d affichage propose alors une interface graphique pour réaliser l interface de notre application Dialog Based : Sélectionner les éléments de la fenêtre : A FAIRE : Placer les contrôles de et les boutons OK et Annuler et les supprimer avec la touche Suppr. Puis réaliser la fenêtre suivante : Pour cela, dans la barre d outils Controls, utiliser les éléments suivants : Static Text : texte statique (modifiable et grisable / masquable ) Edit Box : Champs de saisie, Button : bouton Compléments : En cliquant avec le bouton droit sur un contrôle, il est possible de modifier ses propriétés! D autre part, en plaçant le symbole & (et commercial) devant une lettre, on crée une touche de raccourci. Enfin, avec Layout -> Tab Order, on fixe l ordre de tabulation! Tout d abord, avec Layout -> Tab Order, fixer un ordre de tabulation cohérent à travers la fenêtre. #Niedercorn LT «la Briquerie» 57100 THIONVILLE Programmation Windows : Fenêtre & page 2/7
Ensuite, éditer les propriétés de chaque élément, et fixer les valeurs qui suivent : Éléments Propriétés Static Text ID IDC_resultat Caption resultat Edit Box ID IDC_saisie Button ID IDC_valider Caption valider Lorsque la fenêtre est terminée, vous pouvez apprécier son aspect final en lançant Build -> Execute fenetre.exe ou ctrl + F5, ce qui compile l application et la lance en mode de débogage éventuel (le débogueur sera appelé si nécessaire). Création des variables associées à la saisie Maintenant, il faut : associer des variables aux différents champs que l utilisateur peut fixer, associer du code aux boutons pour les rendre opérationnels. Cela se fait avec le ClassWizard : View -> ClassWizard ou ctrl + w. Lancer le ClassWizard, et aller à l onglet Member Variables. En double-cliquant sur chaque variable, entrer les valeurs comme elles apparaissent su l écran suivant : Les variables ainsi définies peuvent être utilisées librement dans notre programme, dans la classe CFenetreDlg gérant la boite principale de dialogue! Création des fonctions associées au bouton Ensuite, il faut associer des fonctions au bouton Valider. Pour cela, passer à l onglet Message Maps du ClassWizard. Cet onglet permet de : sélectionner un objet dans le cadre Object IDs, sélectionner ensuite un message parmi ceux potentiellement générés par cet objet (fenêtre Messages), associer à ce message une fonction qui sera membre de la classe affichée en haut. Pour les identificateurs IDC_VALIDER, et pour le message BN_CLIQUED (bouton cliqué), associer respectivement les fonctions OnValider().Par défaut, ces fonctions sont de type void et ne reçoivent aucun paramètre, ce qui convient : #Niedercorn LT «la Briquerie» 57100 THIONVILLE Programmation Windows : Fenêtre & page 3/7
Le travail le plus ennuyeux et fastidieux est enfin effectué! Maintenant, nous allons pouvoir nous pencher sur le code à implémenter dans la classe gérant la boite de dialogue : CFenetreDlg. Pour cela, dans la fenêtre WorkSpace, sélectionner l onglet ClassView, puis dans l arborescence, trouver : FenetreClasses -> CFenetreDlg -> Onvalider(). Double-cliquer dessus afin d ouvrir le fichier FenetreDlg.cpp et se placer directement dans le bloc de définition de Onvalider(). On remarque que OnValider() se trouve juste à coté! Entrer le code suivant : void CFenetreDlg::Onvalider() CString ssaisie; UpdateData(true); ssaisie=m_isaisie; MessageBox(sSaisie); Test de l application de base Tester en suite l application : ctrl + F5, et vérifier quelle fonctionne bien. Noter les premiers commentaires et impressions sur cette version «bêta». On se propose de modifier le ficher FenetreDlg.cpp comme suit : Observer le résultat et commenter. void CFenetreDlg::Onvalider() CString ssaisie; UpdateData(true); ssaisie=m_isaisie; MessageBox(sSaisie); CFenetreDlg::SetDlgItemText(IDC_resultat,sSaisie); Examen détaillé des fichiers de notre application. Dans la définition globale des classes, on la classe suivant qui représente notre application : theapp dont voici le listing : // fenetre.cpp : Defines the class behaviors for the application. Ci-dessous, l inclusion de fichiers de définitions (header) de notre application. On remarque l entête «stdafx.h» qui nous permet d utiliser des fonctions de l environnement telle que MessageBox. #Niedercorn LT «la Briquerie» 57100 THIONVILLE Programmation Windows : Fenêtre & page 4/7
#include "stdafx.h" #include "fenetre.h" #include "fenetredlg.h" On précise s il y a lieu le fichier de sortie du mode debug. #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = FILE ; #endif On précise, puisque Windows fonctionne par message entre objets, le lien entre la classe CWinApp (le système) et notre classe CFenetreApp. Le message d aide que peut lancer toute application et qui fait appel à la méthode OnHelp de la classe CWinApp. // CFenetreApp BEGIN_MESSAGE_MAP(CFenetreApp, CWinApp) //AFX_MSG_MAP(CFenetreApp) //AFX_MSG ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() // CFenetreApp construction La méthode CFenetreApp() de la classe CFenetreApp crée l instance theapp (unique objet basé sur la classe CFenetreApp. CFenetreApp::CFenetreApp() // The one and only CFenetreApp object CFenetreApp theapp; // CFenetreApp initialization La méthode InitInstance() de notre classe CFenetreApp qui définit l apparence des contrôles. On crée un objet dlg de classe CFenetreDlg et ensuite on demande l ouverture de la fenêtre MainWnd de notre application. Chaque fois que l on sollicite cette méthode, on vérifie le dialogue et en cas d échec on ferme l application. BOOL CFenetreApp::InitInstance() // Standard initialization #ifdef _AFXDLL Enable3dControls(); #else #endif Enable3dControlsStatic(); // Call this when using MFC in a shared DLL // Call this when linking to MFC statically CFenetreDlg dlg; m_pmainwnd = &dlg; #Niedercorn LT «la Briquerie» 57100 THIONVILLE Programmation Windows : Fenêtre & page 5/7
int nresponse = dlg.domodal(); if (nresponse == IDOK) else if (nresponse == IDCANCEL) // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; Toujours pour les classes, on voit les définitions : La classe CFenetreApp avec ses deux méthodes utilisées ci-dessus. // fenetre.h : main header file for the FENETRE application #if!defined(afx_fenetre_h 30DBE2BB_7507_4F2B_8016_28DA7144EA2D INCLUDED_) #define AFX_FENETRE_H 30DBE2BB_7507_4F2B_8016_28DA7144EA2D INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #ifndef AFXWIN_H #error include 'stdafx.h' before including this file for PCH #endif #include "resource.h" // main symbols // CFenetreApp: // See fenetre.cpp for the implementation of this class // Définition de la classe CFenetreApp basée sur la classe CWinApp avec ses méthodes CFenetreApp InitInstance. class CFenetreApp : public CWinApp public: CFenetreApp(); // Overrides // ClassWizard generated virtual function overrides //AFX_VIRTUAL(CFenetreApp) public: virtual BOOL InitInstance(); //AFX_VIRTUAL // Implementation ; //AFX_MSG(CFenetreApp) //AFX_MSG DECLARE_MESSAGE_MAP() //AFX_INSERT_LOCATION // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif //!defined(afx_fenetre_h 30DBE2BB_7507_4F2B_8016_28DA7144EA2D INCLUDED_) #Niedercorn LT «la Briquerie» 57100 THIONVILLE Programmation Windows : Fenêtre & page 6/7
La classe CFenetreDlg de notre boîte de dialogue avec ses différentes méthodes et ses données. #Niedercorn LT «la Briquerie» 57100 THIONVILLE Programmation Windows : Fenêtre & page 7/7