Programmer une interface graphique avec les MFC et Visual C++...

[ << retour ]

[ >> Télécharger ce didacticiel en PDF ]

1 Les outils

2 Les prérequis

Quelques notions de C/C++

3 But du didacticiel

Nous voulons donc réaliser une interface graphique inutile permettant d'additionner deux chiffres:

image01.jpg

4 Réalisation

4.1 Création du projet

image02.jpg

image03.jpg

image04.jpg

image05.jpg

image06.jpg

4.2 Création de l'interface graphique

Pour vous aider, faîtes apparaître la barre nommée "Control". Un simple glisser-déplacer vous suffira alors pour mettre en place les éléments de l'interface.

Insérons un texte d'explication :

image07.jpg Cliquez sur l'image pour l'agrandir (ouverture dans une autre fenêtre)


sur le même principe, ajoutons un champ qui recevra le premier chiffre :

image08.jpg Cliquez sur l'image pour l'agrandir (ouverture dans une autre fenêtre)


et définissons lui des propriétés (ici, donnons lui un nom clair. C'est surtout utile en présence de nombreux champs pour s'y retrouver) par un clic-droit->Propriétés:

image09.jpg


ajouter de la même façon le deuxième champ (IDC_EDIT_NB2), ainsi qu'un bouton pour sommer :

image10.jpg

4.3 Quelques notes avant de commencer à programmer

Une erreur bête peut être évitée en vérifiant que tous les fichiers incluent le fichier stdafx.h, si jamais vous deviez en ajouter un.

image11.jpg


Le commentaire généré est assez (!) clair. En général il est indiqué où insérer votre code par un //TODO:

image12.jpg Cliquez sur l'image pour l'agrandir (ouverture dans une autre fenêtre)


Avant de commencer, il va falloir initialiser les champs de l'interface graphique. En effet, la valeur d'un élément graphique est divisée en 2 variables: En effet, on ne peut pas manipuler directement le contenu du champ. On est obligé de le mettre à jour à partir d'une seconde variable selon le schéma suivant (sur lequel nous reviendrons):

image13.jpg


Ainsi, il va falloir définir des variables associées aux 2 boutons:

image14.jpg


image15.jpg


Ajouter 2 variables :

image16.jpg

image17.jpg


(ainsi, UpdateData(TRUE) copie les variables de types Control dans les variables de types Value)

Jusqu'à obtenir:

image18.jpg


Ajoutons une méthode appelée lors de l'appuis sur le bouton somme. Retourner sur l'interface graphique:

image19.jpg


cliquer sur le bouton somme et aller dans Edit->Classwizard:

image20.jpg


sélectionner le bouton somme et la méthode d'appel (ici un simple clic). Faire "Add function" :

image21.jpg


Cette méthode s'appellera OnButtonSomme. Elle est automatiquement insérée là où il faut (dans le .cpp et le .h).

il va falloir définir les valeurs d'initialisation pour les champs :

image22.jpg Cliquez sur l'image pour l'agrandir (ouverture dans une autre fenêtre)


Le code est le suivant:

m_edit_nb1_v = 0; // on définit la première valeur à 0 m_edit_nb2_v = 2; // on définit la deuxième valeur à 2 UpdateData(FALSE); // on fait "remonter" les valeurs dans les champs de l'interface graphique

4.4 Passons à la programmation de notre méthode Somme()

Première étape: ajouter notre méthode à la classe CMFCTestDlg.

image23.jpg Cliquez sur l'image pour l'agrandir (ouverture dans une autre fenêtre)


elle prend 2 variables de type int renvoie un int:

image24.jpg


finalement, cliquer sur le bouton "Sommer !" appelle OnButtonSomme() puis Somme(int , int) de la classe CMFCTestDlg. La méthode Somme() contient le code suivant:

int CMFCTestDlg::Somme(int a, int b) { return(a+b); }

Corsons un peu le tout nous allons voir 2 méthodes pour afficher le résultat :

4.4.1 Un popup simple

Le code est :

void CMFCTestDlg::OnButtonSomme() { // TODO: Add your control notification handler code here int res; // le résultat du calcul CString Str_res; // la valeur de la chaine de résultat // On va chercher la valeur entrée dans les champs // (on copie m_edit_nbX_c dans m_edit_nbX_v) UpdateData(TRUE); // on fait la somme des valeurs res = Somme(m_edit_nb1_v,m_edit_nb2_v); // on forme la chaîne contenue dans le popup Str_res.Format("La somme vaut %d",res); // on affiche le popup AfxMessageBox(Str_res); }

qui affiche :

image25.jpg


4.4.2 Une fenêtre avec un champ

Nous allons déjà créer la boîte de dialogue qui va apparaître lors de l'appui sur somme.

image26.jpg Cliquez sur l'image pour l'agrandir (ouverture dans une autre fenêtre)



image27.jpg



image28.jpg Cliquez sur l'image pour l'agrandir (ouverture dans une autre fenêtre)


Ne pas oublier de changer le nom du champ:

image29.jpg


Cette fois, nous n'ajouterons que la variable de type Value! En effet, s'agissant d'un champ de résultat, l'utilisateur n'aura pas à entrer un chiffre, donc nous n'auront pas besoin de faire un UpdateData(TRUE).

Allez dans le classwizard. Vous allez automatiquement générer la classe C++ liée à la boîte de dialogue nouvellement créée :

image30.jpg

image31.jpg

image32.jpg


Une nouvelle classe (un fichier DlgSomme.cpp et un fichier DlgSomme.h) ont été créés. Allons jeter un coup d'oeil dedans.

Les méthodes qui nous intéressent sont le constructeur et OnInitDialog().

Pour pouvoir afficher le résultat dans le champ, il va falloir transmettre le résultat à la boîte de dialogue. Nous pouvons par exemple modifier le constructeur: Le code est :

CDlgSomme::CDlgSomme(CWnd* pParent /*=NULL*/) :CDialog(CDlgSomme::IDD, pParent) { //{{AFX_DATA_INIT(CDlgSomme) m_edit_result_v = 0; //}}AFX_DATA_INIT }

qui devient

CDlgSomme::CDlgSomme(CWnd* pParent, int insertres) :CDialog(CDlgSomme::IDD, pParent) { //{{AFX_DATA_INIT(CDlgSomme) m_edit_result_v = insertres; //}}AFX_DATA_INIT }

Ne pas oublier de modifier DlgSomme.h !

class CDlgSomme : public CDialog { // Construction public: CDlgSomme(CWnd* pParent = NULL); // standard constructor ...

devient

class CDlgSomme : public CDialog { // Construction public: // standard constructor CDlgSomme(CWnd* pParent = NULL, int insertres = 0); ...

Ajoutons une fonction OnInitDialog() à la classe CDlgSomme:

image33.jpg


Modifier ensuite OnInitDialog() (qui est dans la classe CDlgSomme, je le rappelle) :

// TODO: Add extra initialization here UpdateData(TRUE);

Il faut que la boîte de résultat apparaisse lors du clic sur le bouton Sommer ! Nous allons alors devoir ajouter l'appel à la fonction OnButtonSomme() de la classe CMFCTestDlg.

Il faut avant tout inclure dans DlgSomme.cpp :

#include "DlgSomme.h"

puis modifier la méthode OnButtonSomme():

void CMFCTestDlg::OnButtonSomme() { // TODO: Add your control notification handler code here int res; // le résultat du calcul CString Str_res; // la valeur de la chaine de résultat // On va chercher la valeur entrée dans les champs // (on copie m_edit_nbX_c dans m_edit_nbX_v) UpdateData(TRUE); // on fait la somme des valeurs res = Somme(m_edit_nb1_v,m_edit_nb2_v); // on instancie une boîte de dialogue... CDlgSomme dlg(NULL, res); // ... que l'on rend visible. dlg.DoModal(); }

5 Annexe

5.1 Réduire la taille de l'exécutable compilé

Par défaut, Visual C compile en mode debug.

Pour notre exemple, l'exécutable généré pèse près de 1.4Mo. Pour le réduire, il faut passer en mode release: dans le menu Build, sélectionner Set Active Configuration et choisir le mode release.

La taille de votre exécutable passe alors à 120Ko environ.

5.2 Librairies statiques et dynamiques

Par défaut, et pour ce didacticiel notamment, j'ai choisi d'utiliser des librairies statiques.

Dans le cadre de librairies dynamiques, la taille de l'exécutable passe à 105Ko (mode debug), mais impose la présence dans le PATH des librairies nécessaires. A vous de voir.

  Statique Dynamique
Debug 1400 Ko 120 Ko
Release 105 Ko 20 Ko

5.3 Analyse de l'exécutable par Scanbin

Nota: scanbin est un utilitaire de Jean-Claude Bellamy (www.bellamyjc.net).

L'exécutable a été compilé en mode release avec des librairies dynamiques.

DLL utilisées : MFCTest.exe ======================================================== Appels directs -------------------------------------------------------------- c:\winnt\system32 (4 DLL) dll-32 kernel32.dll 16/12/1999 779 536 octet(s) (V.5.00.2191.1 DLL du client API BASE Windows NT) dll-32 mfc42.dll 16/12/1999 995 383 octet(s) (V.6.00.8665.0 MFCDLL Shared Library - Retail Version) dll-32 msvcrt.dll 16/12/1999 295 000 octet(s) (V.6.10.8637.0 Microsoft(R) C Runtime Library) dll-32 user32.dll 16/12/1999 403 216 octet(s) (V.5.00.2180.1 DLL client de l'API Utilisateur de Windows 2000) Appels indirects -------------------------------------------------------------- c:\winnt\system32 (2 DLL) dll-32 gdi32.dll 16/12/1999 234 256 octet(s) (V.5.00.2180.1 GDI Client DLL) dll-32 ntdll.dll 16/12/1999 502 544 octet(s) (V.5.00.2163.1 DLL Couche NT)



Jean guide.net

Valid XHTML 1.0! Valid CSS!