SlideShare une entreprise Scribd logo
1  sur  46
Développement Orienté Objet

  Chapitre 2 : Application basé
     sur boite de dialogue


                  DOO
               N. Bouzrara        1
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
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
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
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
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
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
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
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
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
}
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
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
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
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
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
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
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
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}
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
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
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
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
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
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
É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
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
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
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
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
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);}}
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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

Contenu connexe

En vedette

Brian A. H. J.
Brian A. H. J.Brian A. H. J.
Brian A. H. J.loolaaaa08
 
PresentacióNfotos MaríAde JesúS1
PresentacióNfotos MaríAde JesúS1PresentacióNfotos MaríAde JesúS1
PresentacióNfotos MaríAde JesúS1salvadorangulo
 
Electro Control
Electro   ControlElectro   Control
Electro Controlel22gb
 
Las Drogas
Las DrogasLas Drogas
Las Drogasmarveen
 
Himno De Andalucia Capitulo I
Himno De Andalucia Capitulo IHimno De Andalucia Capitulo I
Himno De Andalucia Capitulo Icosasdeandalucia
 
Diseño Grafico
Diseño GraficoDiseño Grafico
Diseño GraficoLackDx
 
V Foro Hosteltur. Economía y Turismo
V Foro Hosteltur. Economía y TurismoV Foro Hosteltur. Economía y Turismo
V Foro Hosteltur. Economía y TurismoHosteltur
 
Yngrid Arnold - Verdades y mentiras
Yngrid Arnold - Verdades y mentirasYngrid Arnold - Verdades y mentiras
Yngrid Arnold - Verdades y mentirasNeo Consulting
 
Présentation
Présentation Présentation
Présentation youngaya
 
Documento consignado ante la Fiscalía General por Foro por la Vida
Documento consignado  ante la Fiscalía General por  Foro por la Vida Documento consignado  ante la Fiscalía General por  Foro por la Vida
Documento consignado ante la Fiscalía General por Foro por la Vida Espacio Público
 
Wat rong-khun-thailande
Wat rong-khun-thailandeWat rong-khun-thailande
Wat rong-khun-thailandeSaqqarah 31
 
Los Proyectos P
Los Proyectos PLos Proyectos P
Los Proyectos Pmayrarmr
 

En vedette (20)

Tareas
TareasTareas
Tareas
 
Carbasses
CarbassesCarbasses
Carbasses
 
Brian A. H. J.
Brian A. H. J.Brian A. H. J.
Brian A. H. J.
 
Plano De Sax 2ciclo
Plano De Sax 2cicloPlano De Sax 2ciclo
Plano De Sax 2ciclo
 
PresentacióNfotos MaríAde JesúS1
PresentacióNfotos MaríAde JesúS1PresentacióNfotos MaríAde JesúS1
PresentacióNfotos MaríAde JesúS1
 
Electro Control
Electro   ControlElectro   Control
Electro Control
 
Las Drogas
Las DrogasLas Drogas
Las Drogas
 
Soy Maestra
Soy MaestraSoy Maestra
Soy Maestra
 
Himno De Andalucia Capitulo I
Himno De Andalucia Capitulo IHimno De Andalucia Capitulo I
Himno De Andalucia Capitulo I
 
Asg SOlutions1
Asg SOlutions1Asg SOlutions1
Asg SOlutions1
 
PresentacióN1
PresentacióN1PresentacióN1
PresentacióN1
 
Diseño Grafico
Diseño GraficoDiseño Grafico
Diseño Grafico
 
V Foro Hosteltur. Economía y Turismo
V Foro Hosteltur. Economía y TurismoV Foro Hosteltur. Economía y Turismo
V Foro Hosteltur. Economía y Turismo
 
Yngrid Arnold - Verdades y mentiras
Yngrid Arnold - Verdades y mentirasYngrid Arnold - Verdades y mentiras
Yngrid Arnold - Verdades y mentiras
 
Présentation
Présentation Présentation
Présentation
 
Documento consignado ante la Fiscalía General por Foro por la Vida
Documento consignado  ante la Fiscalía General por  Foro por la Vida Documento consignado  ante la Fiscalía General por  Foro por la Vida
Documento consignado ante la Fiscalía General por Foro por la Vida
 
Wat rong-khun-thailande
Wat rong-khun-thailandeWat rong-khun-thailande
Wat rong-khun-thailande
 
Guialeng
GuialengGuialeng
Guialeng
 
Los Proyectos P
Los Proyectos PLos Proyectos P
Los Proyectos P
 
3 Autoesti
3 Autoesti3 Autoesti
3 Autoesti
 

Similaire à Doo

Application Windows Forms VS 2010
Application Windows Forms VS 2010Application Windows Forms VS 2010
Application Windows Forms VS 2010Hajer Dahmeni
 
Convertisseur Pouce en cm et cm en pixel
Convertisseur  Pouce en cm et  cm en pixelConvertisseur  Pouce en cm et  cm en pixel
Convertisseur Pouce en cm et cm en pixelAdad Med Chérif
 
Calculatrice scientifique en JAVA(AWT)
Calculatrice scientifique en JAVA(AWT)Calculatrice scientifique en JAVA(AWT)
Calculatrice scientifique en JAVA(AWT)MOHAMMED MOURADI
 
Slides ceplex
Slides ceplexSlides ceplex
Slides ceplexTECOS
 
04 visual basic .net - les controles standard - exercice
04 visual basic .net - les controles standard - exercice04 visual basic .net - les controles standard - exercice
04 visual basic .net - les controles standard - exerciceHamza SAID
 
Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de donnéesISIG
 
07 visual basic .net - exercice - le programme quick note
07 visual basic .net - exercice - le programme quick note07 visual basic .net - exercice - le programme quick note
07 visual basic .net - exercice - le programme quick noteHamza SAID
 
Programmation événementielle avec VB (ISIG)
Programmation événementielle avec VB (ISIG)Programmation événementielle avec VB (ISIG)
Programmation événementielle avec VB (ISIG)ISIG
 
Access formulaires
Access formulairesAccess formulaires
Access formulaireshassan1488
 
Formation C# - Cours 4
Formation C# - Cours 4Formation C# - Cours 4
Formation C# - Cours 4kemenaran
 
Formation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objetFormation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objetkemenaran
 
Cours c#
Cours c#Cours c#
Cours c#zan
 
Formation html5 css3 java script
Formation html5 css3 java scriptFormation html5 css3 java script
Formation html5 css3 java scriptArrow Group
 
Green System University - Development JDEdwards (French Version) - Tome3
Green System University - Development JDEdwards (French Version) - Tome3Green System University - Development JDEdwards (French Version) - Tome3
Green System University - Development JDEdwards (French Version) - Tome3Minh-Tri Nguyen
 
L’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketL’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketStéphane Legrand
 

Similaire à Doo (20)

Application Windows Forms VS 2010
Application Windows Forms VS 2010Application Windows Forms VS 2010
Application Windows Forms VS 2010
 
Convertisseur Pouce en cm et cm en pixel
Convertisseur  Pouce en cm et  cm en pixelConvertisseur  Pouce en cm et  cm en pixel
Convertisseur Pouce en cm et cm en pixel
 
Calculatrice scientifique en JAVA(AWT)
Calculatrice scientifique en JAVA(AWT)Calculatrice scientifique en JAVA(AWT)
Calculatrice scientifique en JAVA(AWT)
 
Slides ceplex
Slides ceplexSlides ceplex
Slides ceplex
 
04 visual basic .net - les controles standard - exercice
04 visual basic .net - les controles standard - exercice04 visual basic .net - les controles standard - exercice
04 visual basic .net - les controles standard - exercice
 
Python.pptx
Python.pptxPython.pptx
Python.pptx
 
Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de données
 
Javascript
JavascriptJavascript
Javascript
 
07 visual basic .net - exercice - le programme quick note
07 visual basic .net - exercice - le programme quick note07 visual basic .net - exercice - le programme quick note
07 visual basic .net - exercice - le programme quick note
 
Programmation événementielle avec VB (ISIG)
Programmation événementielle avec VB (ISIG)Programmation événementielle avec VB (ISIG)
Programmation événementielle avec VB (ISIG)
 
Apple : iOS
Apple : iOSApple : iOS
Apple : iOS
 
Access formulaires
Access formulairesAccess formulaires
Access formulaires
 
Formation C# - Cours 4
Formation C# - Cours 4Formation C# - Cours 4
Formation C# - Cours 4
 
Développement informatique : Programmation graphique
Développement informatique : Programmation graphiqueDéveloppement informatique : Programmation graphique
Développement informatique : Programmation graphique
 
Formation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objetFormation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objet
 
Cours c#
Cours c#Cours c#
Cours c#
 
Vs2008 Linq
Vs2008 LinqVs2008 Linq
Vs2008 Linq
 
Formation html5 css3 java script
Formation html5 css3 java scriptFormation html5 css3 java script
Formation html5 css3 java script
 
Green System University - Development JDEdwards (French Version) - Tome3
Green System University - Development JDEdwards (French Version) - Tome3Green System University - Development JDEdwards (French Version) - Tome3
Green System University - Development JDEdwards (French Version) - Tome3
 
L’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketL’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacket
 

Doo

  • 1. Développement Orienté Objet Chapitre 2 : Application basé sur boite de dialogue DOO N. Bouzrara 1
  • 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