2.

Fenêtres de dialogue
2.1 Fenêtres de dialogue système
Windows fournit un certain nombre de fenêtres de dialogue
intégrées :
– Boîte de message
– Sélecteur de fichiers
– Sélecteur de couleur
– Sélecteur de police
– Mise en forme de pages pour l’impression
– Impression
– …
Ces fenêtres système sont utilisées très facilement au travers de
classes MFC.
1

2.2 Boîte de message
Une boîte de message sert à présenter un message à l’utilisateur
et à obtenir une réponse de sa part au moyen d’un à trois boutons
sur lesquels il peut cliquer.

Titre
Icône

Message

Boutons

Très utile pour afficher des messages d'erreurs, informer

l'utilisateur, lui demander un choix simple, etc.
On appelle une boîte de message au moyen de la fonction
MessageBox().
2

int MessageBox( LPCTSTR lpText,
LPCTSTR lpCaption = NULL,
UINT
uType = MB_OK );

lpText
Chaîne contenant le texte du message à afficher.
lpCaption
Chaîne contenant le titre (optionnel).
uType
Combinaison indiquant le type de boutons et d’icône (optionnel).
3

Non. Annuler MB_RETRYCANCEL Réessayer. Annuler MB_YESNO Oui. Réessayer. Annuler 4 .Identificateurs de combinaisons de boutons ID Bouton MB_ABORTRETRYIGNORE Abandonner. Ignorer MB_OK OK MB_OKCANCEL OK. Non MB_YESNOCANCEL Oui.

Identificateurs d’icônes ID Icône MB_ICONINFORMATION Icône d’information MB_ICONQUESTION Icône de point d’interrogation MB_ICONSTOP Icône de stop MB_ICONEXCLAMATION Icône de point d'exclamation 5 .

MB_ABORTRETRYIGNORE | MB_ICONSTOP). Exemple: MessageBox ("Mon message". 6 .Combinaison d’identificateurs de boutons et d’icônes Le troisième paramètre nType de la fonction MessageBox() s’obtient par un OU logique (opérateur « | ») des identificateurs de boutons et d’icône."Un titre".

Valeur de retour d’une boîte de message La fonction MessageBox() retourne une valeur entière indiquant le bouton sur lequel l’utilisateur a cliqué : ID Bouton sélectionné IDABORT Abandonner IDRETRY Réessayer IDIGNORE Ignorer IDYES Oui IDNO Non IDOK OK 7 .

choix = MessageBox ("Voulez vous quitter le programme?". MB_YESNO | MB_ICONQUESTION).Exemple int choix. } 8 . "Quitter". if( choix == IDYES ) { PostQuitMessage(0).

3 Autres fenêtres de dialogue standards Les MFC fournissent plusieurs classes C++ pour les fenêtres de dialogues standards : Classe Type CFileDialog Sélecteur de fichier CFontDialog Sélecteur de police CColorDialog Sélecteur de couleur CPageSetupDialog Mise en forme de pages pour l’impression CPrintDialog Impression 9 .2.

2. 5. Déclarer un objet du type de la classe. Définir toutes les propriétés qui doivent être configurées avant d’afficher la fenêtre à l’utilisateur.Toutes ces fenêtres sont utilisées de la même manière : 1. S’il a cliqué sur OK. 10 . Appeler la méthode DoModal() de la classe pour afficher la fenêtre de dialogue à l’utilisateur. récupérer toutes les propriétés que l’utilisateur a pu définir alors qu’il se trouvait sur la fenêtre de dialogue. Capturer la valeur retournée par DoModal() pour déterminer si l’utilisateur a cliqué sur le bouton OK (=IDOK) ou Annuler. 3. 4.

Titre de la boîte Répertoire initial Bouton « Ouvrir » ou « Sauver » Filtres d’extensions 11 .Exemple : boîte de sélection de fichiers.

GetPathName().m_ofn.txt)###BOT_TEXT###*. dialogue_fichier. MessageBox("Fichier sélectionné :" + nom_fichier ).lpstrTitle = "Titre dialogue".lpstrFilter = "Texte (*.// Objet instance de la classe CFileDialog CFileDialog dialogue_fichier(TRUE). } 12 .m_ofn.txt###BOT_TEXT###". // TRUE = Ouvrir // FALSE = Sauver // On initialise certaines données membres de l’objet dialogue_fichier.DoModal() == IDOK ) { // Si l’utilisateur sélectionne un fichier puis clique // sur « Ouvrir ». // On affiche la boîte de sélection de fichiers if( dialogue_fichier. on affiche le nom du fichier CString nom_fichier = dialogue_fichier.

Acdsee. PowerPoint. on a le choix entre trois types de programmes : – Basé sur des boîtes de dialogue (Dialog based) Ex: Calculatrice. … – Basé sur une fenêtre unique (SDI: Single Document Interface) Ex: Bloc-Note.2.4 Fenêtres de dialogue personnalisées Pour créer une application Windows. … 13 . Winzip. Photoshop. … – Basé sur plusieurs fenêtres (MDI: Multiple Document Interface) Ex: Word. Wordpad. Winamp.

Exemple d’application Windows basée sur des boîtes de dialogue : 14 .

4. 15 .2.1 Création Étapes à suivre sous Visual C++ pour créer une application basée sur des boîtes de dialogue. au moyen de l’Assistant Nouveau projet : 1. puis Projet. Aller dans le menu Fichier et sélectionner l’option Nouveau.

4.3. ici : exemple 5. Donner un nom au projet. 2. Sélection du type de projet Visual C++ : MFC 3. OK 16 . Sélection du modèle : Application MFC 4. 2. 5.

Sélection du type d’application : Basée sur des boîtes de dialogue 17 . 6.6.

Terminer 18 .7. 7.

19 .

contrairement à un programme utilisant directement l’API Windows.2.2 Code Avec les MFC. Cette fonction est cachée par le mécanisme des MFC. Un programme écrit avec les MFC comporte au moins deux classes : – Une classe d’application – Une classe de fenêtre 20 . pas besoin d’écrire de fonction Winmain().4.

à l’exécution et à la fermeture de l’application. à l’initialisation. 21 .1) Classe d’application Tout programme Windows écrit au moyen des MFC contient une classe d’application dérivant de la classe CWinApp (CWinApp=classe de base d’une application Windows). Cette classe comporte tous les éléments nécessaires au lancement.

.. Le squelette de cette classe est automatiquement écrit par l’assistant de création d’application MFC du Visual C++.cpp pour son implémentation (= fichier principal de l’application). on aura la classe d’application CexempleApp : class CexempleApp : public CWinApp { public : BOOL InitInstance().h pour la déclaration de la classe et un fichier exemple. }. 22 . . Le Visual C++ crée automatiquement un fichier exemple.Si on crée un projet appelé « exemple ».

CexempleApp). Cette méthode permet d’initialiser l’application (voir plus loin).La méthode InitInstance() est une méthode virtuelle de la classe de base CWinApp. 23 . que l’on surcharge dans la classe d’application dérivée (ici.

24 . etc. L’éditeur de ressources du Visual C++ permet à l’utilisateur de créer très facilement de manière graphique l’interface du programme en disposant des contrôles (boutons. champs éditables.2) Classe de fenêtre En plus d’une classe d’application. une application MFC nécessite une classe de fenêtre pour créer un interface graphique avec laquelle pourra interagir l’utilisateur.) sur une boîte de dialogue.

25 . C’est une classe dérivée héritant de la classe CDialog..L’assistant crée automatiquement une classe correspondant à la boîte de dialogue ainsi crée : class CexempleDlg : public CDialog { public : CexempleDlg(). }. Le Visual C++ crée automatiquement un fichier exempleDlg..h pour la déclaration de cette classe et un fichier exempleDlg. .cpp pour son implémentation.

26 . Dans le cas d’une application basée sur des fenêtres (SDI ou MDI).. }.. .Note : cette déclaration de classe correspond à une application basée sur des boîtes de dialogue. on aurait écrit : class CexempleWnd : public // Au lieu de CFrameWnd CDialog { public : CexempleWnd().

Le panneau Affichage de classes permet de voir les différentes classes de l’application. 27 . avec le détail de leurs données et de leurs méthodes.

// Déclare un objet interface dlg. Cette méthode InitInstance() est automatiquement écrite par l’assistant du Visual C++.DoModal()..3 Initialisation de l’application L’initialisation de l’application se fait dans la méthode InitInstance() de la classe d’application CexempleApp : BOOL CexempleApp : InitInstance() { CexempleDlg dlg. L’interface est ensuite affichée et automatiquement gérée par l’appel à la méthode DoModal().. 28 . } Une instance dlg de l’interface est crée.4. // et la gère automatiquement .2.

Dans le fichier principal exemple. C’est l’assistant de création MFC du Visual C++ qui se charge d’écrire automatiquement cette déclaration dans exemple.cpp. Cet objet est déclaré comme ayant une portée globale.cpp 29 . un objet de type CexempleApp est crée (et c’est la seule instance de la classe CexempleApp) : CexempleApp theApp.

En résumé Lors de la création d’une application basée sur des boîtes de dialogue au moyen de l’assistant de création MFC.h exempleDlg.cpp (d’autres fichiers sont également crées) 30 . si on nomme le projet exemple l’assistant créera automatiquement les fichiers : – – – – exemple.cpp exempleDlg.h exemple.

vcproj 31 .Dossier du projet Fichiers sources Fichiers de configuration du projet Pour recharger un projet précédemment créé. lancer le fichier d’extension .

A chacune d’entre elle correspondra une classe dérivant de la classe CDialog. 32 . celle qui sera affichée dans la méthode InitInstance() de la classe d’application. tout comme pour la classe CexempleDlg.Remarque Une application basée sur des boîtes de dialogue doit comporter au moins une boîte. Mais une application peut très bien comporter plusieurs boîtes de dialogue.

L’éditeur se chargera de créer automatiquement. pour chaque nouvelle boîte de dialogue. les classes correspondantes et les écrira dans des nouveaux fichiers .De même que pour la première boîte de dialogue de l’application.cpp et .h 33 . on crée ces autres boîtes au moyen de l’éditeur de ressources du Visual C++.

4 Création de l’interface Une fenêtre de dialogue peut comporter (entre autres) les contrôles standards suivants : – – – – – – – Texte statique (1) Champ de saisie (2) Case à activer (3) Liste déroulante (4) Bouton (5) Bouton radio (6) … 1 2 3 4 5 6 34 .4.2.

Une fenêtre de dialogue par défaut est proposée : 35 .

Check box Edit Control L’interface d’une application peut être construite visuellement avec des outils de Visual C++ en disposant des contrôles à partir d’une palette de contrôles. Button 36 .

Tous les contrôles sont en fait des objets. instances de classes MFC : Contrôle Classe Champ éditable CEdit Bouton CButton Texte CStatic Liste déroulante CListBox 37 .

Propriétés de la case à cocher 38 .On peut éditer les propriétés des contrôles dans le panneau Propriétés de l’éditeur de ressources En particulier. un identificateur unique doit être donné à chaque contrôle (ici : IDC_CHECK1).

2. 39 . Par exemple. Une case à cocher permet de saisir une valeur booléenne (coché=true. non coché=false).5 Manipulation des données de l’interface Les différents contrôles de la boîte de dialogue permettent de représenter des valeurs entrées par l’utilisateur. un champ éditable permet d’entrer une chaîne de caractères ou un nombre.4. etc.

40 . en modifiant les valeurs affichées par l’interface en fonction des valeurs de variables du programme.  Écriture : il faut également pouvoir faire l’opération inverse.On souhaite donc pouvoir réaliser deux types d’opérations sur les valeurs représentées par les contrôles de l’interface :  Lecture : il faut pouvoir lire les valeurs entrées par l’utilisateur au travers de l’interface graphique et les affecter à des variables.

41 . ces variables devenant des données membres de la classe associée à la boîte de dialogue contenant ces contrôles. Les valeurs des contrôles pourront être lues et modifiées par l’intermédiaire de ces variables.4.2.6 Déclaration de données membres On peut associer des variables aux contrôles.

Pour associer une variable à un contrôle d’une boîte de dialogue. 42 . On le fait apparaître avec un clic droit sur le contrôle choisi et en sélectionnant l’option « Ajouter une variable » dans le menu contextuel. on utilise l’Assistant ajout de variable membre du Visual C++.

) 2. 43 . CString pour un champ éditable. Le type de la variable dépend de la nature du contrôle (BOOL pour une case à cocher. 2. etc.Dans la boîte qui apparaît : 1. 1. Entrer le nom de la variable qui représentera le contrôle choisi.

Cette variable deviendra une donnée membre de la classe représentant la boîte de dialogue comportant ce contrôle. 44 .

2. qui est une méthode de la classe CDialog (et donc par héritage une méthode de la classe dérivée représentant une boîte de dialogue).4.7 Actualisation des variables et des contrôles Maintenant qu’un contrôle est représenté par une variable d’une classe. il faut pouvoir répercuter les modifications de l’un sur l’autre et inversement (ce n’est pas automatique). 45 . Ceci se fait au moyen de la fonction UpdateData(BOOL sens).

UpdateData(true).UpdateData(false). 46 . (variables  contrôles) Permet de modifier les valeurs affichées par tous les contrôles de la boîte de dialogue en leur affectant les valeurs contenues dans les variables qui leur sont associées. (contrôles  variables) Permet de modifier toutes les variables associées aux contrôles d’une boîte de dialogue en leur affectant les valeurs affichées par les contrôles.

Exemple La variable m_nom de type CString est associée au champ éditable d’une boîte de dialogue représentée par la classe CexempleDlg : CexempleDlg::une_fonction() { m_nom = "Jean". }  Modifie la valeur affichée par le contrôle 47 . UpdateData(false).

}  La variable m_nom prendra la valeur « Marc ».Si l’utilisateur a entré « Marc » dans le champ éditable CexempleDlg::une_autre_fonction() { UpdateData(true). 48 .

4. on souhaite pouvoir accéder à l’objet tout entier correspondant à ce contrôle.2. Dans certaines situations. Il existe pour cela deux solutions : – La fonction GetDlgItem() – Création d’un objet avec l’Assistant Ajout de variable membre 49 . comme par exemple lors de son initialisation. Or chaque contrôle est en fait un objet correspondant à une classe MFC.8 Accès à la classe d’un contrôle En associant une variable à un contrôle. pour pouvoir en modifier certaines caractéristiques. on ne peut que lire ou modifier la valeur de ce contrôle.

50 . Ex: CSliderCtrl *sliderptr = (CSliderCtrl*)GetDlgItem(IDC_SLIDER1).1. sliderptr->SetRangeMin(0). La fonction GetDlgItem() La fonction GetDlgItem() reçoit en paramètre l’identificateur d’un contrôle et retourne un pointeur vers l’objet correspondant à ce contrôle. sliderptr->SetRangeMax(255).

Création d’un objet avec l'assistant Ajout de variable Avec l'assistant Ajout de variable. on peut créer un objet associé à un contrôle.2. 51 .

52 .

53 . objet_slider) qui est un objet du type du contrôle.On rajoute ainsi à la classe de dialogue une donnée membre (ici.

54 .Les modifications de cet objet se répercutent sur le contrôle dans l’interface au moyen de la fonction UpdateData() vue précédemment.

etc.9 Messages d’évènements associés aux contrôles Les actions effectuées sur un contrôle entraînent l’envoi de messages par Windows.4. la modification d’un champ éditable. le déplacement d’un ascenseur. Chaque contrôle (=objets) possède des méthodes permettant de réagir à ces actions.2. 55 . A chaque type de contrôle peuvent correspondre des évènements de nature différente : l’appui sur un bouton. la modification d’une case à cocher.

au moyen de l’Assistant Gestionnaire d’évènements.On peut. 56 . réécrire ces fonctions pour traiter les différentes actions auxquelles les contrôles sont soumis.

1. 57 . 4. 2. 1. 3. Sélectionner le type de message Sélectionner la classe Donner le nom de la méthode qui traitera ce message Ajouter cette méthode à la classe 2. 4. 3.

L’assistant du Visual C++ va écrire l’en-tête de la nouvelle méthode
dans le .h et le .cpp décrivant la classe. Il suffit au programmeur
de remplir cette méthode en rajoutant le traitement qu’il souhaite.

void CexempleDlg::OnBnClickedButton1()
{
// TODO: Ajoutez ici le code de votre gestionnaire
// de notification de contrôle

}

58

2.4.10 Quelques classes de contrôles
• Button
• List Box
• Combo Box
• Scroll-bar
• Static
• Edit
• Radio Button
• Check Box
• Slider

: CButton
: CListBox
: CComboBox
: CScrollBar
: CStatic
: CEdit
: CButton
: Cbutton
: CSliderCtrl

59

Tous ces contrôles héritent d’autres classes MFC.

Ils partagent
communes.

donc

des

caractéristiques

et

des

méthodes

60

Boîte de liste (List Box) Classe : CListBox 61 .

CString& rString ) Retourne la chaîne de caractères de l’élément désigné par l’index. int SetTopIndex( int nIndex ). int GetTopIndex() Retourne l’index du premier élément affiché.Méthodes : int GetCount() Retourne le nombre d’éléments de la liste. Indique si un élément donné est sélectionné ou non. 62 . int GetSel( int nIndex ). Fixe l’index du premier élément à afficher. void GetText( int nIndex.

63 . Fixe l’index de l’élément sélectionné (sélection simple). int DeleteString( int nIndex ). Ajoute une chaîne de caractères à la liste. int AddString( CString chaine ). Supprime une chaîne de la liste. void ResetContent(). Vide la liste. int SetCurSel( int nSelect ).int GetCurSel() Retourne l’index de l’élément sélectionné (sélection simple).

Liste déroulante (Combo Box) Classe : CComboBox 64 .

int SetTopIndex( int nIndex ).Méthodes : int GetCount() Retourne le nombre d’éléments de la liste. 65 . int GetTopIndex() Retourne l’index du premier élément affiché. Fixe l’index du premier élément à afficher.

int GetCurSel() Retourne l’index de l’élément sélectionné. int SetCurSel( int nSelect ). 66 . int AddString( CString chaine ). Fixe l’index de l’élément sélectionné. Supprime une chaîne de la liste. Ajoute une chaîne de caractères à la liste. int DeleteString( int nIndex ).

… 67 . avec ou sans graduation. vertical.Curseur (Slider) Classe : CSliderCtrl Curseur horizontal.

Retourne la position du curseur. int nMax.Méthodes : void SetRange( int nMin. int GetPos(). Fixe la position du curseur. 68 . Si bRedraw=TRUE. Fixe la fréquence des graduations (ex: nFreq=2  une graduation toutes les 2 unités). Fixe la valeur minimale et maximale. void SetTicFreq( int nFreq ). le contrôle est redessiné. void SetPos( int nPos ). BOOL bRedraw = FALSE ).

une méthode ou une fonction. cliquer sur son nom dans votre code source et appuyer sur F1.Pour plus de renseignements sur les différentes classes de contrôles et leurs méthodes. Réflexe à avoir : pour plus d’informations sur une classe. consulter l’aide en ligne de Visual C++. 69 .