2. Plan
Les Boites de dialogues
Création d’une application Dialog based
Les Contrôles
Echange de données de boîtes de dialogue
Création et affichage de boîtes de dialogue
Les fenêtres de messages
Classes dialog communes
Ajout d’un menu à une boîte de dialogue
Fonctions membres fréquemment remplacées de
la classe CDialog
2
3. Les Boites de dialogues
Les boîtes de dialogue représentent le moyen de
communication courant entre les applications de
type Windows et l'utilisateur.
La classe CDialog offre une interface de gestion
des boîtes de dialogue
l'Éditeur de boîtes de dialogue Visual C++ facilite
la conception des boîtes de dialogue et la
création de leurs ressources de modèle de boîte
de dialogue
Enfin, les Assistants Code simplifient le
processus d'initialisation et de validation des
contrôles dans une boîte de dialogue, ainsi que le
processus de collecte des valeurs entrées par
l'utilisateur.
3
4. Création d’une application Dialog based
avec AppWizard(1)
Lancement de l’assistant AppWizard :
sélectionner File | New | Projects |MFC
AppWizard (.exe)
Project Name = nom du projet (ici
MainDialog)
Location : chemin du répertoire qui
contiendra le projet
Step 1 : sélectionner « Dialog Based »
Step 2/4 : garder les options cochées
par défaut (About box, 3D controls,
ActiveX Controls)
Step 3/4 : les assistants peuvent
génèrer des commentaires (préférable
de garder cette option).
Step 4/4 : résume les classes générées
(cliquer sur Finish)
4
5. Création d’une application Dialog based
avec AppWizard(2)
Compiler/Linker : lancer la commande [Build | Build (F7)]
pour produire l’exécutable de ce projet puis l’exécuter
(CTRL+F5).
On a obtenu une application de type boite de dialogue
Le rôle du programmeur est de faire évoluer ce squelette
initial :
en complétant les méthodes générées, en ajoutant de
nouvelles
en ajoutant des classes etc.
un autre assistant nommé ClassWizard va nous
permettre d’ajouter des gestionnaires de messages, de
créer des classes associées à des ressources de boîte
de dialogue, d’associer des objets à des contrôles etc.
5
6. Création d’une application Dialog based
avec AppWizard(3)
Modifier la ressource de boîte de dialogue principale
Visualiser RessourceView a l’aide de l’onglet
RessourcesView de la fenêtre Workspace
Ajouter deux contrôles Button, deux zones d’édition
de texte, deux textes statiques
6
7. Création d’une application Dialog based
avec AppWizard(4)
Ajouter des gestionnaires de message à l’aide de
ClassWizard
Ajouter les deux méthodes OnButtonA()et OnButtonB()
comme réponse au message BN_CLICKED au deux boutons.
// MainDialogDlg.h (vue partielle)
class CMainDialogDlg : public CDialog
{//…
// Generated message map functions
//{{AFX_MSG(CMainDialogDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButtonA(); // prototypes ajoutés par ClassWizard
afx_msg void OnButtonB();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}; 7
8. Création d’une application Dialog based
avec AppWizard(5)
// MainDialogDlg.cpp (vue partielle)
//…
BEGIN_MESSAGE_MAP(CMainDialogDlg, CDialog)
//{{AFX_MSG_MAP(CMainDialogDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTONA, OnButtonA) //ajout d’une
entrée à la table des messages
ON_BN_CLICKED(IDC_BUTTONB, OnButtonB) //ajout d’une
entrée à la table des messages
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
8
9. Création d’une application Dialog based
avec AppWizard(6)
Ajout des variables membres aux contrôles
// class MainDialogDlg.h (vue partielle)
class CMainDialogDlg : public CDialog
{
//…
public:
CMainDialogDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CMainDialogDlg) // bannières qu’il ne faut pas modifier
!
enum { IDD = IDD_MAINDIALOG_DIALOG};
CEdit m_editB; // les objets membres créés par ClassWizard
CEdit m_editA;
CButton m_boutonB;
CButton m_boutonA;
//}}AFX_DATA // bannières qu’il ne faut pas modifier !
}; 9
10. Création d’une application Dialog based
avec AppWizard(7)
void CMainDialogDlg::OnButtonA()
{
// TODO: Add your control notification handler code here
CString str; // CString est la classe MFC de gestion des
chaînes
m_editA.GetWindowText(str); //str est une sortie de
CEdit::GetWindowText(CString &)
m_editB.SetWindowText(str); //str est une entrée de
CEdit::SetWindowText(LPCSTR)
}
void CMainDialogDlg::OnButtonB()
{
// TODO: Add your control notification handler code here
CString str;
m_editB.GetWindowText(str);
m_editA.SetWindowText(str); 10
}
11. Contrôles communs de Windows et
classes MFC
Contrôle Classe MFC Description
Button CButton Boutons de commande qui
déclenchent une action, également
utilisés pour les cases à cocher, les
cases d'options et les zones de
groupe
combo box CComboBox Combinaison d'une zone d'édition et
d'une zone de liste
edit box CEdit Zones qui permettent d'entrer du
texte
list box CListBox Zone qui contient une liste de
chaînes
scroll bar CScrollBar Barre de défilement utilisée comme
un contrôle dans une boîte de
dialogue (pas dans une fenêtre)
static-text CStatic Texte servant à étiqueter d'autres 11
contrôles
12. Check Box ou case à cocher(1)
Une case à cocher est un booléen (vrai ou faux)
contrairement au bouton radio qui est un entier et qui
permet donc de gérer un groupe d’options. Créez
autant de « Check Box» que nécessaire.
Page propriété
L’option « Tab stop »
permet d’accéder à la
case à cocher avec la
touche tabulation.
BN_CLICKED
Messages BN_DOUBLE_CLICKED
12
13. Check Box ou case à cocher(2)
Variables associées de type: Bool
Supposons on a créer une boite de dialogue contenant
deux Checkbox, on associe les variables booléennes :
m_music et m_sport.
Déclaration des variabes dans la classe de la boite de
dialogue:
class CControleDlg : public CDialog
{
// Construction
public:
CControleDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CControleDlg)
enum { IDD = IDD_CONTROLE_DIALOG };
BOOL m_music;
BOOL m_sport;
//}}AFX_DATA 13
14. Check Box ou case à cocher(3)
Si on veut paramètrer la valeur par défaut de la variable
c’est dans le constructeur de la boite de dialogue.
CControleDlg::CControleDlg(CWnd* pParent /*=NULL*/)
: CDialog(CControleDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CControleDlg)
m_music = FALSE;
m_sport = TRUE;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
- L’option sport va être coché par défaut
14
15. Les Combo Box ou zone de liste
modifiable(1)
Ce contrôle sert à afficher une liste d’options.
La page propriété vous permet de changez les
propriétés si nécessaire. Un clic sur le point
d’interrogation de la boite de dialogue vous
donnera la signification de toutes ces options.
L’option « sort » fait un tri alphabétique des données
15
16. Les Combo Box ou zone de liste
modifiable(2)
Elle supporte plusieurs modes de
fonctionnements conditionnés à la valeur de la
zone Type:
Le mode simple
Une zone d’édition et une zone
fixe de choix réglable.
Le mode Drop Down
Une zone d’édition et une liste
Déroulante popup pour les options
Le mode Drop List
Une liste déroulante pour les options
celles-ci n'étant pas modifiables.
16
17. Les Combo Box ou zone de liste
modifiable(3)
Le remplissage d’une CCombobox:
Il peut se faire de deux manières:
- Les données sont fixes:
Les données sont saisies au niveau de l’onglet « Data » . Pour
passer à la ligne entre chaque élément de la liste, il suffit de
cliquer sur « Ctrl+Enter ».
- Le remplissage est dynamique:
Il suffira de remplir la CCombobox par sa méthode AddString,
dans la methode InitInstance() de la classe de boite de dialogue:
17
18. Les Combo Box ou zone de liste
modifiable(4)
Créer une variable m_combo1 attaché au combobox de type CCombobox
BOOL CControleDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this
automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set
big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_combo1.AddString(« Jaune");
m_combo1.AddString(« Rouge");
m_combo1.AddString(« Vert");
return TRUE; // return TRUE unless you set the 18
focus to a control}
19. Les Combo Box ou zone de liste
modifiable(5)
Méthode Role Exemple
InsertString Même rôle que M_combo1.InsertString(-1,”jaune”) ;
AddString, on précise Si l’index=-1: insertion en bout de liste
l’emplacement de
l’insertion.
SetCurSel Sélection d’une ligne. Sélection du dernier élément de la comboxbox :
elle retourne l’indice de Int nCount=m_combo1.GetCount() ;
l’élément sélectionné If(nCount>0) SetCurSel(nCount-1);
GetCurSel Récupération de la Récupération de l’indice de l’item en sélection:
sélection en cours Int GetCurSel() ;
Récupération d’une chaîne pour un numéro d'indice:
CString str ;
Int nIndex=m_combo1.GetCurSel();
M_combo1.GetLBText(nIndex,str);
AfxMessageBox(str);
DeleteString Suppression d’une Suppression de tous les éléments de la combobox :
ligne For(int i=0;i<m_combo1.GetCount();i++)
{
M_combo1.DeleteString(i);
}
Ce code peut être écrit autrement:
M_combo1.ResetContent();
19
20. Edit Box (ou zone d’édition)
A la différence du « label » ou « Static Box », ce contrôle permet à
l’utilisateur de taper du texte réutilisable. Par contre, ces deux
contrôles permettent d’afficher une valeur venant d’une autre
source.
Propriété du contrôle Edit:
Le mode multi ligne
La saisie exclusive de nombre
La gestion du scroll horizontal et vertical du texte (passage a la
ligne automatiquement)
La saisie en mode mot de passe
La mise en majuscule / minuscule
La possibilité de mettre l’edit en lecture seule
20
21. List Box ou zone de liste(1)
Le plus simple est de travailler avec une Clistbox
Utiliser une variable de la classe CListBox
attachée au contrôle et utiliser directement les
méthodes de cette classe
Les méthodes:
- Supposons qu’on a créée une variable m_maliste de type CListBox
attaché au contrôle ListBox
21
22. List Box ou zone de liste(2)
Méthodes Role Exemple
AddString Insérer des éléments CString str= « option1 »
dans la liste m_maliste.AddString(str) ;
GetText Récupérer le texte Récupérer le texte de la ligne sélectionnée:
d’une ligne. CString str ;
Int nIndex=m_maliste.GetCurSel() ;
M_maliste.GetText(nIndex,str) ;
AfxMessageBox(str);
DeleteString Supprimer une ligne On doit chercher le numéro d’index de la
ligne en utilisant la fonction FindString
nIndex =m_maListe.FindString(0, « Coucou ») ;
m_maliste.DeleteString(nIndex);
Supprimer la ligne en cours de selection:
Int nIndex =m_maliste.GetCurSel() ;
m_maliste.DeleteString(nIndex) ;
SetCurSel Sélectionner le Int nCount=m_maListe.GetCount() ;
dernier élément If(nCount>0) m_maListe.SetCurSel(nCount-1);
ResetContent Détruire tous les éléments M_maliste.ResetContent() ;
22
23. Radio Button (ou Boutons bascule)
Un bouton radio est un entier. Il permet donc de gérer un groupe
d’options.
Souvent on crée un « Group Box » qui contiendra les boutons.
Cette zone de groupe sert à rassembler de façon fonctionnelle les
boutons radios et à indiquer le titre du groupe.
choisir l’option « Group » pour le premier bouton de chaque
groupe.
On associe une variable au premier bouton du groupe de type
entier. Les boutons radio d’un groupe sont considéré comme un
tableau d’entier :0,1,2..
Pour donner une valeur de départ à l’affichage de la fenêtre il
suffit d’initialiser la variable du bouton radio dans la fonction
InitDialog
23
24. Echange de données de boîtes de
dialogue
lorsque l’on associe des variables aux contrôles (category
Value dans ClassWizard), ce sont les appels de la méthode
héritée CDialog::UpdatData(BOOL) qui activent les échanges
entre les variables et les contrôles.
Cette méthode utilise la méthode virtuelle
CControlesDlg::DoDataExchange() surdéfinie dans notre
classe spécifique (dérivée de CDialog) pour réaliser les
transferts DDX (Dynamic Data eXchange) entre variables et
contrôles.
CDialog::UpdateData(TRUE); //transferts DDX dans le sens
contrôles->variables
CDialog::UpdateData(FALSE) ; //transferts DDX dans le sens
variables->contrôles
24
25. Échange de données de boîtes de
dialogue
Le mécanisme DDX transmet les valeurs des variables membres aux contrôles
de la boîte de dialogue, où elles apparaissent lorsque la boîte de
dialogue elle-même apparaît.
Le même mécanisme transmet les valeurs entre les contrôles et les variables
membres lorsque l'utilisateur clique sur le bouton OK (ou à chaque fois que
Vous appelez la fonction membre UpdateData avec l'argument TRUE).
25
26. Création et affichage de boîtes de
dialogue
On peut, ajouter des boîtes de dialogue supplémentaires pour
assurer la communication avec l’utilisateur (saisie de données,
affichage de données).
La création d'un objet dialog se déroule en deux temps
Etape1: construire l'objet dialog
Etape2 : créer la fenêtre de la boîte de dialogue
Création d'une boîte de dialogue
Type de boîte de Méthode de création
dialogue
Non Modale Construisez CDialog, puis appelez la fonction
membre Create.
Modale Construisez CDialog, puis appelez la fonction
membre DoModal.
26
27. Boîtes de dialogue modales(1)
Définition:
Est la boite de dialogue la plus utilisée, elle interdit
l'accès au reste des fenêtres du programme tant
qu’elle est ouverte.
L’utilisateur ferme la boite de dialogue en cliquant sur
le bouton:
OK, CDialog::DoMolal() retourne alors la constante IDOK
CANCEL, CDialog::DoMolal() retourne alors la constante
IDCANCEL
De FERMETURE x, CDialog::DoMolal() retourne alors la
constante IDCANCEL
27
28. Boîtes de dialogue modales(2)
Etapes de création
ajouter une ressource de boîte de dialogue (Insert
| Resource).
Placer des contrôles dans cette nouvelle
ressource de boîte de dialogue puis lancer
ClassWizard.
Associer une classe dérivée de CDialog à cette
nouvelle ressource.
créer un objet automatique de la classe créée,
puis invoquer sa méthode DoModal()
28
29. Boîtes de dialogue modales(3)
Application:
une boîte de dialogue s’ouvre
sur un click sur le bouton Dlg.
Cette boîte de dialogue
permet à l’utilisateur de saisir
une chaîne de caractère.
Cette chaîne s’affiche dans la
zone d’édition de la boîte de
dialogue principale si
l’utilisateur ferme la boîte de
saisie en cliquant sur OK.
29
30. Boîtes de dialogue modales(4)
Avec ClassWizard, associer des variables CString aux zones
d’édition de la boîte principale (CMainDlg::m_edit) et de la boîte
fille (CSaisieDlg::m_edit).
Créer un gestionnaire de message sur le click sur le bouton Dlg.
// MainDlg.Cpp (vue partielle du fichier d’implémentation de la boîte
principale)
#include “SaisieDlg.h” // insertion du fichier header de la boîte de dialogue
//… implémentation de CMainDlg
// gestionnaire de click sur le bouton Dlg
void CMainDlg::OnButtonDlg()
{
// TODO: Add your control notification handler code here
CSaisieDlg dlg; // objet automatique de la classe CSaisieDlg
if(dlg.DoModal()==IDOK) // DoModal() retourne IDOK si la boîte est fermée
avec OK
{
m_edit=dlg.m_edit; // m_edit : associé au contrôle de la boîte principale
// dlg.m_edit : associé au contrôle de la boîte dlg
30
UpdateData(FALSE);}}
31. Boîtes de dialogue non modales(1)
Définition:
Sont moins utilisées, elle autorise l'accès a l’application
tant qu’elle est ouverte.
Etapes de création
Créer une ressource de boîte de dialogue (Insert |
Resource).
Associer une classe dérivée de CDialog à cette ressource
via ClassWizard.
Créer un objet de cette classe puis appeler sa méthode
CDialog::Create().
31
32. Boîtes de dialogue non modales(2)
Exemple:
on crée une application Main avec AppWizard, de type «
Dialog Based », dont la classe de boîte de dialogue
principale est CMainDlg. Cette boîte de dialogue principale
contient un menu dont la seule entrée est une commande
intitulée « Boîte non modale ». Cette commande est censée
afficher une boîte non modale.
On choisi un ID pour la boîte non modale:
IDD_NONMODALE_DLG
On associe la classe CNonModaleDlg pour la boite non
modale:
32
33. Boîtes de dialogue non modales(3)
Ajouter un membre de type CNonModaleDlg à la classe de la
boîte de dialogue principale
#include "NonModaleDlg.h"
class CMainDlg : public CDialog
{
// Construction
public:
CNonModaleDlg m_dlg; // objet membre (pour la boîte non
// modale)
Appeler la méthode Create() de l’objet de boîte non modale
dans le gestionnaire OnInitDialog() de la boîte principale.
m_dlg.Create(IDD_NONMODALE_DLG,this); // crée la fenêtre pour la
// boîte
33
34. Boîtes de dialogue non modales(4)
Ajout du gestionnaire de la commande du menu:
void CMainDlg::OnBoiteNonModale()
{
// gestionnaire de la commande “Boîte non modale”
// du menu de la boîte principale : affiche/cache la
// boîte non modale
if(m_dlg.IsWindowVisible())
m_dlg.ShowWindow(SW_HIDE);
else m_dlg.ShowWindow(SW_SHOW); // rend la
//fenêtre visible
}
34
35. Les fenêtres de messages(1)
Bon nombre des dialogues avec l’utilisateur consistent à
poser des questions auxquelles l’utilisateur répond par Oui,
Non, Recommencer, Annuler … Les boîtes de message
permettent la gestion de tels échanges.
Il y a deux façons de créer des boîtes de messages:
AfxMessageBox: fonction de l’API Windows (cette fonction
n’est membre d’aucune classe).
MessageBox: fonction de la classe CWnd
35
36. Les fenêtres de messages(2)
int AfxMessageBox( « chaîne de caractère a affiché », style de la boite =
MB_OK );
le style de la boîte
MB_ABORTRETRYIGNORE La boîte contient 3 boutons : Abort, Retry, et
Ignore.
MB_OK La boîte contient 1 bouton : OK.
MB_OKCANCEL La boîte contient 2 boutons: OK et Cancel.
MB_RETRYCANCEL La boîte contient 2 boutons: Retry et Cancel.
MB_YESNO La boîte contient 2 boutons: Yes et No.
MB_YESNOCANCEL La boîte contient 3 boutons: Yes, No, et Cancel.
Le style peut être combiné par un OU logique avec les styles d’icônes
suivantes
MB_ICONHAND, MB_ICONSTOP, and MB_ICONERROR
MB_ICONQUESTION
MB_ICONEXCLAMATION et MB_ICONWARNING
MB_ICONASTERISK et MB_ICONINFORMATION
36
37. Les fenêtres de messages(3)
La valeur de retour est :
0 Si mémoire insuffisante pour afficher la boîte
IDABORT Le bouton Abort a été sélectionné.
IDCANCEL Le bouton Cancel a été sélectionné.
IDIGNORE Le bouton Ignore a été sélectionné.
IDNO Le bouton No a été sélectionné.
IDOK Le bouton OK a été sélectionné.
IDRETRY Le bouton Retry a été sélectionné.
IDYES Le bouton Yes a été sélectionné.
37
38. Les fenêtres de messages(4)
int CWnd::MessageBox(« chaîne de caractère a
affichée», « titre de la boite », style de la boite =
MB_OK );
Le style prend les mêmes valeurs que pour la
fonction afxMessageBox.
Exemple :
MessageBox("Voulez-vous réellement
annuler?", "Annuler ?",
MB_YESNO|MB_ICONQUESTION);
38
39. Classes dialog communes
En plus de la classe CDialog, MFC fournit plusieurs classes dérivées de
CDialog qui encapsulent des boîtes de dialogue fréquemment utilisées,
appelées « boîtes de dialogue communes »
Classe dialog dérivée Fonction
CColorDialog Permet à l'utilisateur de sélectionner les couleurs.
CFileDialog Permet à l'utilisateur de sélectionner un nom de
fichier à ouvrir ou à enregistrer.
CFindReplaceDialog Permet à l'utilisateur de lancer une opération de
recherche ou de remplacement dans un fichier
texte.
CFontDialog Permet à l'utilisateur de spécifier une police.
CPrintDialog Permet à l'utilisateur de spécifier des informations
pour un travail d'impression.
CPrintDialogEx Feuille de propriétés d'impression Windows 2000. 39
40. Ajout d’un menu à une boîte de
dialogue(1)
Une boîte de dialogue peut exploiter un menu:
Des gestionnaires d’événements peuvent alors être affectés
aux différentes commandes du menu via ClassWizard (comme
pour les contrôles).
40
41. Ajout d’un menu à une boîte de
dialogue(2)
Etapes de création Description
- Ajouter une ressource de
menu en sélectionnant la
commande [Insert| Resource]
puis choisir Menu.
- L’éditeur de ressources permet
alors de modifier le menu (penser
à attribuer un ID au menu)
- Dans l’onglet General des
propriétés de la boîte de
dialogue, sélectionner l’ID de la
ressource de menu
41
42. Fonctions membres fréquemment
remplacées de la classe CDialog
Fonction Message auquel elle Objet du remplacement
membre répond
OnInitDialog WM_INITDIALOG Initialisation des contrôles
de la boîte de dialogue.
OnOK BN_CLICKED pour le Réponse quand
bouton IDOK l'utilisateur clique sur le
bouton OK.
OnCancel BN_CLICKED pour le Réponse quand
bouton IDCANCEL l'utilisateur clique sur le
Bouton Annuler.
42
43. Interception des clicks sur les boutons
OK/CANCEL de la boîte(1)
Exemple1
L’exemple ci-dessous présente le traitement réalisé pour
s’assurer que le texte saisi dans la zone d’édition a exactement
6 caractères (figure cicontre).
La classe de boîte de dialogue est CTestDlg, cette classe
contient un objet CString associé à la zone d’édition.
43
44. Interception des clicks sur les boutons
OK/CANCEL de la boîte(2)
void CTestDlg::OnOK()
{
UpdateData(); //MAJ de m_edit_str associé à la zone d’édition
if(m_edit_str.GetLength()!=6)
{
MessageBox("Saisir 6 caractères", "Vérifier le nombre de
caractères",MB_OK);
return; //la boîte reste “ouverte”
}
CDialog::OnOK(); // ferme la boîte et retourne IDOK
}
44
45. Interception des clicks sur les boutons
OK/CANCEL de la boîte(3)
Exemple2
L’exemple ci-dessous montre comment s’assurer que
l’utilisateur souhaite réellement annuler lorsqu’il clique sur le
bouton Cancel (figure ci-contre), ou lorsqu’il ferme la boîte en
cliquant sur le bouton de fermeture X.
45
46. Interception des clicks sur les boutons
OK/CANCEL de la boîte(4)
void CTestDlg::OnCancel()
{
if (MessageBox("Voulez-vous réellement annuler?",
"Annuler ?",
MB_YESNO|MB_ICONQUESTION)== IDNO )
return; // laisse à l’utilisateur la chance de revenir sur son
annulation
CDialog::OnCancel(); // ferme la boîte et retourne
//IDCANCEL
}
46