18
© A. Benabbou Programmation en VC++ avec les MFC La MFC (Microsoft Foundation Class) est une bibliothèque de classes réutilisables développées en C++ pour la plate forme Windows (voir figure). La classe CObject est la classe de base des classes MFC et permet la compatibilité entre ces différentes classes. Remarques : MFC contient aussi un sous ensemble de classes qui n’héritent pas de CObject Convention d’écriture : § Les classes MFC commencent toutes par la lettre C suivie du nom de la classe commençant par majuscule § Les mots constituant le nom d’une méthode commencent tous par majuscule § Les variables en minuscules § Les constantes sont toutes en majuscules 1. La classe CString Classe très utilisée par les programmes basés sur les MFC. Elle permet de traiter les chaînes de caractères dynamiques et surcharge les opérateurs =, = =, !=,+ et +=. La conversion d’un objet CString en chaîne char* se fait à l’aide du casting (const char*) . Quelques méthodes : int GetLength() Renvoie le nombre de caractères de la chaîne bool IsEmpty() Teste si la chaîne est vide void Empty() vide la chaîne void GetAt(int i) Retourne le caractère à la position donnée, similaire à l’opérateur [] void SetAt(int i, char x) Mets un caractère à la position donnée CString Mid(int pos, int nb) CString Left(int nb) CString Right(int nb) Extrait une sous chaîne de longueur nb à partir d’une position ou de la gauche ou de la droite d’une chaîne int Find(char x, int pos) int Find(char *s, int pos) Cherche la 1 ère occurrence du caractère x ou de la sous chaîne s dans la chaîne en commençant à partir de la position pos void Format(''sp'', v1,v2,…) Similaire à sprintf, permet d’écrire les variables v1, v2,… dans la chaîne en utilisant les spécificateurs de format donnés dans la chaîne ''sp''. void MakeUpper() void MakeLower() Conversion en majuscule/minuscule de tous les caractères de la chaîne 2. La classe CWnd CWnd offre les fonctions de base pour toutes les classes fenêtres de la bibliothèque MFC, en par1iculier les contrôles ( zone d’édition, bouton, etc.) car ils héritent tous de CWnd. Généralement on n'a jamais recourt à créer une instance directe de la classe CWnd, on utilise généralement une classe qui dérive de CWnd comme CFrameWnd ou CDialog etc. Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Programmation en VC++ MFC

  • View
    45

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Programmation en VC++ MFC

© A. Benabbou

Programmation en VC++ avec les MFC

La MFC (Microsoft Foundation Class) est une bibliothèque de classes réutilisables développées en C++ pour la plate forme Windows (voir figure). La classe CObject est la classe de base des classes MFC et permet la compatibilité entre ces différentes classes. Remarques :

MFC contient aussi un sous ensemble de classes qui n’héritent pas de CObject Convention d’écriture : § Les classes MFC commencent toutes par la lettre C suivie du nom de la classe

commençant par majuscule § Les mots constituant le nom d’une méthode commencent tous par majuscule § Les variables en minuscules § Les constantes sont toutes en majuscules 1. La classe CString Classe très utilisée par les programmes basés sur les MFC. Elle permet de traiter les chaînes de caractères dynamiques et surcharge les opérateurs =, = =, !=,+ et +=. La conversion d’un objet CString en chaîne char* se fait à l’aide du casting (const char*).

Quelques méthodes :

int GetLength() Renvoie le nombre de caractères de la chaîne

bool IsEmpty() Teste si la chaîne est vide

void Empty() vide la chaîne

void GetAt(int i) Retourne le caractère à la position donnée, similaire à l’opérateur []

void SetAt(int i, char x) Mets un caractère à la position donnée

CString Mid(int pos, int nb) CString Left(int nb) CString Right(int nb)

Extrait une sous chaîne de longueur nb à partir d’une position ou de la gauche ou de la droite d’une chaîne

int Find(char x, int pos) int Find(char *s, int pos)

Cherche la 1ère occurrence du caractère x ou de la sous chaîne s dans la chaîne en commençant à partir de la position pos

void Format(''sp'', v1,v2,…) Similaire à sprintf, permet d’écrire les variables v1, v2,… dans la chaîne en utilisant les spécificateurs de format donnés dans la chaîne ''sp''.

void MakeUpper() void MakeLower()

Conversion en majuscule/minuscule de tous les caractères de la chaîne

2. La classe CWnd CWnd offre les fonctions de base pour toutes les classes fenêtres de la bibliothèque MFC, en par1iculier les contrôles ( zone d’édition, bouton, etc.) car ils héritent tous de CWnd. Généralement on n'a jamais recourt à créer une instance directe de la classe CWnd, on utilise généralement une classe qui dérive de CWnd comme CFrameWnd ou CDialog etc.

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 2: Programmation en VC++ MFC

© A. Benabbou

Quelques méthodes : § void SetWindowText( '' texte'') : permet d'écrire du texte dans la fenêtre. § void GetWindowText( s) : transmet tout le texte de la fenêtre vers la chaîne s. § void CenterWindow( ) : permet de centrer la fenêtre relativement à sa fenêtre mère. § CWnd* SetFocus( ) : positionne le focus sur la fenêtre et renvoie un pointeur sur l'objet

fenêtre qui avait le focus sinon elle renvoie NULL. § void MoveWindow( int x, int y, int w, int h) : change la position et la taille de la fenêtre § BOOL ShowWindow( int sw ) : affiche ou cache la fenêtre, le paramètre sw spécifie la

manière d'affichage de la fenêtre: . SW_SHOW : affiche la fenêtre. . SW_HIDE : cache la fenêtre. . SW_SHOWMAXIMIZED : Affiche la fenêtre dans sa taille maximale . SW_SHOWMINIMIZED : Réduit la fenêtre en icône

§ BOOL EnableWindow( bool etat=true ) : rend la fenêtre active ou non § void SetFont( CFont* pFont ) : spécifies une nouvelle fonte pour la fenêtre § CFont* GetFont( ) : renvoie un pointeur sur l'objet fonte courante de la fenêtre § CDC* GetDC( ) : Renvoie un pointeur de type contexte de. périphérique pour la zone

vue de la fenêtre

§ CMenu* GetMenu( ) : renvoie un pointeur sur l'objet menu de la fenêtre. § BOOL SetMenu(CMenu* pMenu) : spécifie l'objet pMenu comme menu de la fenêtre.

Si pMenu est NULL la fenêtre n'aura pas de menu. 3. Premier programme Windows Un programme sous Windows est constitué au moins de deux classes :

§ Une classe application qui hérite de CWinApp et permettant de lancer l’application et d’afficher la fenêtre principale, et

§ Une classe fenêtre représentant la fenêtre principale de l’application. Celle-ci hérite de généralement de la classe CFrameWnd ou CDialog ou d’une autre classe dérivée de CWnd.

Exemple : § Créer un projet vide de type Win32 Application § Demander l’utilisation des MFC dans le menu Project->Settings->General en

sélectionnant Use MFC in a Shared DLL à la place de Not Using MFC § Créer un fichier source vide projet.cpp § Ajouter en haut du programme la directive #include ‘'afxwin.h’'

#include "afxwin.h" class Fenetre : public CFrameWnd{

public : Fenetre(){ //constructeur par défaut } }; class Application : public CWinApp{ public : virtual BOOL InitInstance(){ Fenetre *f=new Fenetre(); f->Create(NULL,"Le titre de ma fenêtre"); f->ShowWindow(SW_SHOW); this->m_pMainWnd=f; return true;

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 3: Programmation en VC++ MFC

© A. Benabbou

} }; //créer une instance de l’application Application *app=new Application();

§ Le programme ne contient pas un main explicite, il est appelé automatqiuement par les MFC lors de la création d’un objet de la classe CWinApp.

§ La méthode InitInstance() est automatiquement appelée par le constructeur de CWinApp et permet d’initialiser l’application et de créer et afficher la fenêtre principale.

§ L’attribut m_pMainWnd de CWinApp permet d’indiquer le nom de la fenêtre principale. § C’est la méthode Create() de CFrameWnd qui permet de créer la fenêtre et de préciser un

titre de celle-ci. 4. Programme utilisant l’IDE VC++ On peut utiliser l’IDE de VC++ pour créer des applications MFC plus rapidement et en utilisant l’éditeur de ressources pour créer les éléments de la fenêtre en mode design. Il suffit de spécifier que le projet est de type MFC Application et de suivre les étapes de l’assistant. On peut alors choisir entre plusieurs types d’applications : mono document, multiple documents ou basé sur une boîte de dialogue. Le dernier type est le plus simple car il génère uniquement deux classes comme dans l’exemple précédent, la fenêtre étant ici une classe dérivée de CDialog et non de CFrameWnd. On peut alors ajouter des contrôles à la boîte de dialogue et modifier leurs propriétés ou leur associer un gestionnaire d’évènement dans la fenêtre Propriétés de l’IDE. On peut aussi associer aux contrôles des noms d’objets des classes correspondantes en choisissant ajouter une variable dans le menu contextuel du contrôle (utiliser le bouton droit de la souris).

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 4: Programmation en VC++ MFC

© A. Benabbou

5. Les contrôles standard de VC++ Tous les contrôles de VC++ dérivent de la classe CWnd et sont donc considérés comme une fenêtre (un conteneur de contrôles). Les méthodes et les attributs de la classe CWnd sont donc automatiquement accessibles par tous ces contrôles. Pour créer n’importe quel contrôle de VC++, il faut appeler son constructeur (généralement le constructeur par défaut) et ensuite appeler la méthode Create(…) qui permet de créer l’aspect visuel du contrôle et spécifie sa fenêtre conteneur en paramètre. En plus, la méthode Create() doit attribuer au contrôle un entier unique représentant son identificateur dans le domaine des ressources visuelles de l’application (le dernier paramètre de Create). Exemple :

//création d’un objet bouton de commande CButton *b=new CButton() ; //rectangle représentant les dimensions du contrôle CRect r(x,y,w,h); //création du contrôle bouton b->Create("Caption ", WS_VISIBLE, r, f, ID); //f est le nom de la fenêtre //et ID est un entier identifiant le contrôle //WS_VISIBLE est un style du contrôle

5.1 Contrôle Bouton Un bouton est un objet de la classe CButton qui dérive de CWnd. Cette classe représente à la fois les boutons de commande, les cases à cocher et les boutons radios. La différence se fait au niveau du paramètre style du bouton de la méthode Create(). Parmi les styles on peut citer :

§ BS_PUSHBUTTON : permet de créer un bouton de commande § BS_AUTOCHECKBOX : permet de créer une case à cocher § BS_AUTORADIOBUTTON : permet de créer un bouton radio § BS_GROUPBOX : permet de créer un cadre pour grouper d’autres boutons

-Les boutons de commande Un bouton de commande ou bouton poussoir est un contrôle utilisé spécifiquement pour lancer les traitements lorsque l'on clique sur celui-ci. Un bouton de commande réagit lorsque les événements associés aux messages suivants se produisent: ON_BN_CLlCKED : L'utilisateur click sur le bouton ON_BN_DOUBLECLICKED : l'utilisateur double click sur le bouton Exemple :

//création d’un objet case à cocher CButton *b=new CButton() ; //rectangle représentant les dimensions du contrôle Crect r(x,y,w,h); //création du contrôle case à cocher b->Create("Caption ", WS_VISIBLE | BS_AUTOCHECKBOX ,r,f,ID);

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 5: Programmation en VC++ MFC

© A. Benabbou

-Cases à cocher Une case à cocher est un contrôle qui affiche une côche ou un croisillon lorsqu’on clique avec la souris. Les cases à cocher représentent des options conjonctives càd qu’il est possible de cocher plusieurs cases ou aucune, parmi un groupe de cases à cocher. En général un programme ne réagit pas directement à un click de la case à cocher. Il se contente de connaître ou de modifier l'état de la case à un moment précis. On peut ensuite utiliser les méthodes suivantes pour la variable associée à une case à cocher : § int GetCheck( ) : permet de retourner l'état de la case à cocher ou du bouton radio (1 si le

bouton est sélectionné et 0 sinon) § void SetCheck( int etat ) : permet de spécifier l'état de la case à cocher ou du bouton

radio (1 si le bouton est sélectionné et 0 sinon)

-Boutons radio C’est un contrôle qui affiche une marque lorsqu’on clique avec la souris. Les boutons radio représentent des options strictement disjonctives càd qu’il n’est possible de marquer qu’un seul bouton parmi un groupe de boutons radio. La programmation des boutons radio ressemble au bouton de commande càd programmer l’événement click sur chaque option. En plus on ajoute une variable entière (ou d’un autre type) à la classe qui permet de prendre le numéro de l’option choisie lorsqu’on clique sur cette option.

void ClasseDlg ::OnClickedRadioX() { variable=numOptionX; }

Remarque : On peut associer aux contrôles des variables (de catégorie « control ») à l’aide de ClassWizard. Mais on peut aussi obtenir un pointeur sur n’importe quel contrôle d’une fenêtre en utilisant la méthode membre GetDlgItem( ) qui prend comme paramètre l’identificateur du contrôle concerné : CWnd* GetDlgItem( int ID) ; Exemple : si on a un bouton radio dont l’identificateur est IDC_RADIO1 on peut récupérer le contrôle correspondant par :

CButton *br = (CButton*) GetDlgItem(IDC_RADIO1); 5.2 Contrôle ListeBox Un contrôle zone de liste est un objet de la classe CListBox. Comme les autres classes associées à des contrôles, CListBox dérive de la classe CWnd. § Ajout d’un item à une liste Il existe deux méthodes pour ajouter des éléments à un contrôle zone de liste:

§ A l'aide de la fonction membre AddString(item) où item spécifie la chaîne à ajouter Exemple : m_List.AddString ("Ali");

§ A l'aide de la fonction membre InsertString(indice, item) en spécifiant l'indice de l’item à insérer, le premier élément étant à l'indice 0. Exemple: m_List.InsertString(0, "Mohamed");

Les chaînes ajoutées à une zone de liste dont la propriété « Sort » est activée sont automatiquement triées lorsqu'elles sont ajoutées. Dans le cas contraire, elles sont simplement ajoutées à la fin de la liste. § Nombre d'éléments d'une liste La fonction membre GetCount() retourne le nombre d'éléments d’une zone de liste. Exemple : int nbElements=m_List.GetCount();

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 6: Programmation en VC++ MFC

© A. Benabbou

§ Suppression d'éléments d'une liste La fonction membre DeleteString(indice) supprime l’item à l’indice donné en paramètre de la liste. Exemple : m_List.DeleteString(0); § Vider une liste Pour vider entièrement une zone de liste, on utilise la fonction membre ResetContent(). Exemple : m_List.ResetContent() ; § Sélectionner un élément La fonction SetCurSel(indice) permet de sélectionner un élément donné par son indice. Exemple : m_List.SetCurSel(0) ; § Indice de l'élément sélectionné La fonction GetCurSel() renvoie l'indice de l'élément actuellement sélectionné. Si aucun élément n'est sélectionner elle retourne la valeur -1. Exemple : int indice=m_List.GetCurSel() ; § Texte d’un item La fonction GetText(indice, s ) renvoie dans la chaîne s l’item dont l’indice est donné comme 1er paramètre. On peut utiliser cette fonction avec GetCurSel() pour retrouver l’item qui vient d’être sélectionné dans la liste. Exemple :

int indice = _m_List.GetCurSel() ; If(indice !=-1) {

CString item; m_List.GetText(indice, item) ; MessageBox(item,''élément sélectionné'');

} § Recherche d'un item La fonction FindString(i, s) recherche à partir de l’indice i, une entrée de la liste qui commence par une chaîne s et retourne l’indice trouvé. La fonction FindStringExact(i, s) recherche à partir de l’indice i, une entrée de la liste correspondant exactement à une chaîne s et retourne l’indice trouvé. § Evènement En général, on programme l’événement LBN_SELCHANGE correspondant à un changement de sélection d’un item dans la liste. 5.3 Contrôle Combo Un combo comprend des fonctionnalités d’un contrôle zone d’édition et zone de liste. Un combo est un objet de la classe CComboBox qui dérive elle aussi de la classe CWnd. § Type du combo On peut préciser un parmi les trois types de combo suivants en utilisant la propriété Type :

o Simple : combo déroulé initialement et la zone d’édition est active o Dropdown : combo modifiable, la zone d’édition est active o DropList : combo non modifiable, la zone d’édition est inactive

§ Traitement sur les items La classe CComboBox offre les mêmes fonctions que celles qu’on a présenté pour la classe ClistBox sauf la fonction GetText( ) qui est prend ici le nom GetLBText(indice, s ). § Récupérer le texte saisie dans le combo Pour récupérer le texte saisie par l'utilisateur dans la zone d’édition, on utilise la fonction GetWindowText(s) comme pour les zones de texte.

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 7: Programmation en VC++ MFC

© A. Benabbou

Evènement En général, on programme l’événement CBN_SELCHANGE correspondant à un changement de sélection d’un item dans la liste du combo. Remarque : Si on ajoute ce contrôle à l’aide de l’IDE :

o Il faut prendre le soin de l’agrandir suffisamment avant de le lâcher dans la fenêtre.

o Il est possible d'ajouter des données en mode création au combo. Pour cela dans l'onglet Data de la fenêtre de propriétés du contrôle saisissez vos données et appuyer sur Ctrl+Entrée après chaque item.

5.4 Contrôle Static Il est représenté par la classe CStatic. Un controle Static peut afficher du texte, un cadre, un rectangle, une icon, un curseur ou un bitmap. Ce type de contrôle ne génère généralement pas d’évènements mais on peut le programmer pour l’événement BN_CLICK en modifiant son ID qui est par défaut IDC_STATIC et en modifiant sa propriété NOTIFY qui lui permettra de déléguer le traitement des évènements à sa fenêtre mère. Si on veut programmer d’autres évènements alors il faut créer une classe spécialisée pour ce contrôle en héritant de la classe CStatic. 5.5 Contrôle Picture Il permet généralement d’afficher des images Bitmap ou des icônes. C’est aussi un contrôle Static représenté par la même classe CStatic et peut être contrôlé de la même manière.

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 8: Programmation en VC++ MFC

© A. Benabbou

5.6 Contrôles ActiveX Les contrôles ActiveX (ou OCX) permettent de réaliser des logiciels basés sur des composants. Un ActiveX est un composant qui peut être réalisé dans n’importe quel langage et qui communique avec son conteneur via une interface respectant le modèle COM (Component Object Model). Il existe plusieurs types d’ActiveX qu’on peut inclure dans une fenêtre il suffit d’utiliser « insérer un contrôle ActiveX » dans le menu contextuel du bouton droit. Exemple de contrôles ActiveX : § MSFlexGrid et MSHFlexGrid : Permettent de représenter une grille de données.

Méthodes les plus utilisées (avec des petites différences entre MSFlexGrid et MSHFlexGrid):

• get_ColumnCount()/put_ColumnCount() : Renvoie ou définit le nombre total de colonnes d'un contrôle MSFlexGrid.

• get_Cols()/put_Cols() : Renvoie ou définit le nombre total de colonnes d'un contrôle MSHFlexGrid. De même : get_FixedCols()/put_FixedCols() ou bien getFixedColumnCount()/put_FixedColumnCount() : pour les colonnes fixes

• get_RowCount()/put_RowCount() : Renvoie ou définit le nombre total de lignes d'un contrôle MSFlexGrid.

• get_Rows()/put_Rows() : Renvoie ou définit le nombre total de lignes d'un contrôle MSHFlexGrid. De même : get_FixedRows()/put_FixedRows() ou bien get_FixedRowCount()/put_FixedRowCount): pour les lignes fixes

• get_TextMatrix()/ put_TextMatrix() : Renvoie ou définit le contenu de texte d'une cellule désignée par sa ligne et sa colonne.

Exemple : flex.put_ColumnCount(4);

flex.put_TextMatrix(0,0,"user1"); flex.put_TextMatrix(0,1,"Ali"); flex.put_TextMatrix(0,2,"12/2/2000");

§ MSChart : permet l’affichage de données sous forme de courbes de différents types.

Méthodes les plus utilisées : • get_ChartType()/put_ChartType() : Renvoie ou définit le type de graphique

utilisé (un entier entre 1 et 14). • get_RowCount()/put_RowCount() : Renvoie ou définit le nombre de ligne de

l’axe des abscisses (représente le nombre de subdivisions de l’axe des abscisses). • get_ColCount()/put_ColCount() : Renvoie ou définit le nombre de colonnes

dans chaque ligne de l’axe des abscisses (représente le nombre de courbes). • get_Row()/put_Row() : Renvoie ou sélectionne la ligne courante. • get_RowLabel()/put_RowLabel() : Renvoie ou définit le label de la ligne

courante. • get_Col()/put_Col() : Renvoie ou sélectionne la courbe courante dans la légende. • get_ColLabel()/put_ColLabel() : Renvoie ou définit le label de la courbe

courante dans la légende. • get_Data()/put_Data() : Renvoie ou définit la donnée pour la courbe courante et

pour la ligne courante. Exemple :

chart.put_RowCount(2); chart.put_Row(1); chart.put_RowLabel("Janvier"); chart.put_Row(2);

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 9: Programmation en VC++ MFC

© A. Benabbou

chart.put_RowLabel("Fevrier");

chart.put_ColumnCount(2); chart.put_Column(1); chart.put_ColumnLabel("crédit"); chart.put_Column(2); chart.put_ColumnLabel("debit");

chart.put_Row(1); chart.put_Column(1); chart.put_Data("125");

5.7 Contrôles CListCtrl et CImageList Un contrôle CListCtrl permet d’afficher une suite quelconque d'icônes avec des étiquettes, comme dans l'Explorateur Windows, ou des listes en colonnes de texte avec ou sans icônes. Un item d'un contrôle CListCtrl se compose d'une icône et d'une étiquette (éventuellement aussi d'autres informations). Les icônes des items sont contenues dans des listes d'images de type CImageList. La fonction membre Create permet de créer la liste d’images en précisant la taille des images (cx et cy), leur nombre initial n, ainsi que le nombre d’images k qu’on peut éventuellement ajouter à cette liste.

CImageList *pmyImageList=new CImageList(); pmyImageList->Create(cx, cy, 0, n, k); Les images peuvent être réalisées sous forme de Bitmap dans les ressources du programme puis chargées à l’aide de la fonction LoadBitmap dans des objets de type CBitmap.

CBitmap bm1; bm1.LoadBitmap(IDB_BITMAP1); Ces images seront alors ajoutées à la liste à l’aide de la fonction Add en spécifiant aussi le masque de l’image comme couleur RGB : pmyImageList->Add(&bm1, RGB(0, 0, 0)); La liste des images est associée au contrôle CListCtrl par la fonction setImageList : listCtrl.SetImageList(pmyImageList,LVSIL_NORMAL ); Les items du contrôle CListCtrl peuvent être visualisés sous 4 formes possibles qu’on peut intégrer dans un contrôle CListCtrl : icônes, petites icônes, liste et rapport. Le paramètre LVSIL_NORMAL permet d’indiquer l’aspect normal des icônes, on peut aussi utiliser LVSIL_SMALL (icônes miniatures) ou LVSIL_STATE (état). Finalement on ajoute les items au contrôle en appelant la fonction InsertItem. Qui indique la position i, le label de l’item et le numéro j de l’icône associée dans la liste des images.

listCtrl.InsertItem(i,"Label",j); Exemple:

CImageList *pmyImageList=new CImageList(); pmyImageList->Create(32, 32, 0, 2, 0); CBitmap bm1,bm2; bm1.LoadBitmap(IDB_BITMAP1); bm2.LoadBitmap(IDB_BITMAP2); pmyImageList->Add(&bm1, RGB(0, 0, 0)); pmyImageList->Add(&bm2, RGB(0, 0, 0)); listCtrl.SetImageList(pmyImageList,LVSIL_NORMAL );

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 10: Programmation en VC++ MFC

© A. Benabbou

listCtrl.InsertItem(0,"Courbe 2D",0);

listCtrl.InsertItem(1,"Histogramme 2D",1); On peut programmer divers évènements associés au contrôle CListCtrl, particulièrement l’événement NM_CLICK pour récupérer l’item sélectionné. Il suffit alors d’appeler les fonctions GetSelectionMark() qui retourne l’indice de l’élément sélectionné et GetItemText(i,0) qui retourne le label de l’item numéro i.

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 11: Programmation en VC++ MFC

© A. Benabbou

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 12: Programmation en VC++ MFC

© A. Benabbou

6. Bases de données DAO (Data Access Object) (<afxdao.h>) Les classes MFC qui permettent de gérer les bases de données DAO appartiennent à la bibliothèque « afxdao.h », parmi elles :

• la classe CDaoDatabase : permet de gérer la base de données (création, ouverture, la femeture, etc.)

• la classe CDaoTableDef : permet de gérer les tables de la base (création de la table, la création des champs, ajout de la table à la base, etc.)

• la classe CDaoRecordset : permet de gérer le contenu càd les tuples de la table (ajout, modification, suppression, recherche, etc.)

• la classe CDaoQueryDef : permet de créer des requêtes SQL les sauvegarder ou les exécuter

I. Création d’une base de données Les étapes de création sont: 1- Créer la base : //creation de la base de données CDaoDatabase db; db.Create("nomBaseDonnes"); 2- Créer une table et ses champs :

CDaoTableDef table(&db); table.Create("nomTable"); table.CreateField("nomChamp", typeChamp,tailleChamp);

Type taille (octets) Description

dbBoolean 1 byte BOOL

dbByte 1 BYTE

dbInteger 2 Int

dbLong 4 Long

dbCurrency 8 Currency (COleCurrency)

dbSingle 4 Float

dbDouble 8 Double

dbDate 8 Date/Time (COleDateTime)

dbText 1 – 255 Text (CString)

dbLongBinary 0 Long Binary (OLE Object), CLongBinary or CByteArray

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 13: Programmation en VC++ MFC

© A. Benabbou

dbMemo 0 Memo (CString) Exemple :

CDaoDatabase db; db.Create("DBUsers");

CDaoTableDef table(&db); table.Create("Users"); table.CreateField("login",dbText,20); table.CreateField("pwd",dbText,10); table.CreateField("dateNaissance",dbDate,0); table.CreateField("sexe",dbBoolean,0); Remarque : • On peut utiliser un 4ème paramètre dans CreateField qui peut prendre les valeurs

suivantes (on peut aussi les combiner à l’aide de l’opérateur |) :

Valeur Description

dbFixedField La taille du champ est fixe

dbVariableField La taille du champ est variable (uniquement pour le texte)

dbAutoIncrField Le champ contiendra une valeur entière incrémentale automatiquement

dbUpdatableField Le champ peut être modifié

dbDescending Le champ est trié par ordre décroissant • La fonction DeleteField(nomChamp) permet de supprimer un champ existant dans la

table. 3- Ajouter la table à la base : table.Append(); table.Close(); db.Close(); II. Utilisation d’une base de données existante On peut : • utiliser les contrôles ActiveX : « DAO Data » et « DataGrid » • utiliser la classe CDaoRecordset en suivant les étapes suivantes : 1- Ouvrir la base de données : CDaoDatabase db; db.Open("nomBaseDonnes");

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 14: Programmation en VC++ MFC

© A. Benabbou

2- Ouvrir un recordset associé à une table ou à une requête SQL : CDaoRecordset rs(&db); rs.Open (dbOpenTable, "nomTable");

ou bien: rs.Open (dbOpenDynaset, "requeteSQL"); Remarque: Si une opération ne se termine pas correctement, elle génére une exception de type CDaoException qu’on peut capturer à l’aide d’un try-catch: Exemple:

try{ CDaoDatabase db; db.Open("nomBaseDonnes"); } catch(CDaoException *e){ MessageBox(“erreur d’ouverture de la base de données); }

3- Accéder à la valeur d’un champ: VARIANT v; v=rs.GetFieldValue(nomChamp); ou bien : v=rs.GetFieldValue(numChamp); La structure VARIANT contient un attribut pour chaque type de données : intVal (entier), fltVal (réel), bstrVal (chaine), etc. Exemple :

CDaoDatabase db; db.Open("DBUsers"); CDaoRecordset rs(&db); rs.Open (dbOpenTable, "Users");

VARIANT v=rs.GetFieldValue(“login”); MessageBox((const char*) v.bstrVal);

4- Ajout d’un tuple à la table : //ajouter un tuple vide rs.AddNew() ;

//remplir le tuple : rs.SetFieldValue(nomChamp, valeur) ;

... //mettre à jour la table : rs.Update() ;

Remarque: La fonction SetFieldValue possède 4 surcharges:

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 15: Programmation en VC++ MFC

© A. Benabbou

rs.SetFieldValue(nomChamp, valeur); ou bien: rs.SetFieldValue(numChamp,valeur); ou bien: rs.SetFieldValue(nomChamp,”valeur”); ou bien: rs.SetFieldValue(numChamp,”valeur”);

5- Mise à jour d’un champ : //chercher le tuple à modifier : ... // ouvrir le tuple courant en mode édition : rs.Edit() ;

//modifier le tuple : rs.SetFieldValue(nomChamp valeur) ;

... //mettre à jour la table : rs.Update() ;

6- Suppression d’un tuple : //chercher le tuple à supprimer : ... // Supprimer le tuple courant: rs.Delete() ;

//passer au tuple suivant pour valider la suppression : rs.MoveNext() ; 7- Recherche et navigation dans un recordset

• La fonction IsBOF() : retourne true si on est avant le premier tuple de la table • La fonction IsEOF() : retourne true si on est après le dernier tuple de la table • La fonction MoveNext() : avancer au tuple suivant • La fonction MovePrev() : reculer au tuple précédent • La fonction Move(n) : sauter n tuples vers l’avant (ou vers l’arrière si n est <0) • La fonction FindFirst(’’critère’’) : cherche le premier tuple qui respecte le

critère spécifié (agit comme la clause where) • La fonction FindNext(’’critère’’) : cherche le tuple suivant qui respecte le

critère spécifié à partir du tuple courant • La fonction FindLast(’’critère’’) : cherche le dernier tuple qui respecte le

critère spécifié • La fonction FindPrev(’’critère’’) : cherche le tuple précédent qui respecte le

critère spécifié à partir du tuple courant III. Utilisation des requêtes stockées (CDaoQueryDef)

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 16: Programmation en VC++ MFC

© A. Benabbou

• Créer une requête SQL : CDaoQueryDef q ; q.Create(nomRequete, reqSQL) ; nomRequete est une chaîne représentant le nom de la requete si on veut la stocker dans la base de données sinon on met la valeur NULL.

• Exécuter la requête : q.Execute() ;

Remarque : on peut aussi exécuter une requête SQL directement avec la méthode Execute de la classe CDaoDatabase. 7. Bases de données ODBC (<afxdb.h>) ODBC (Open DataBase Connectivity), il s'agit d'un format défini par Microsoft permettant la communication entre des clients bases de données fonctionnant sous Windows et les SGBD du marché. ODBC est le moyen standard d’accéder à n’importe quelle base de données. On peut utiliser une base de données avec ODBC seulement si on a la DLL du pilote compatible avec le format de cette base de données. En général, il existe un pilote ODBC pour la majorité des moteurs de base de données, dont Access, SQL Server, mySQL, Oracle, etc. 1. Enregistrement dans la base des registres Avant de pouvoir utiliser une base de données via ODBC, vous devez l'inscrire dans la base de registres :

• cliquer sur le panneaux de configuration, sélectionner Outils d'administration et enfin Source de données ODBC.

• sélectionner l'onglet DSN utilisateur ( Source de données utilisateur : seul l’utilisateur en cours y aura accès) ou DSN système (accès par tous les utilisateurs de l’ordinateur)

• Cliquez sur Ajouter pour ajouter une source de données • Cliquez sur Terminer • Une autre boite s'affiche, tapez le nom de votre source de données, ce nom sera utilisé

par tous les programmes ayant besoin d’accéder à la base de données. • Cliquez sur le bouton Sélectionner pour accéder à la dernière boîte de dialogue où

vous pouvez sélectionner le fichier qui représente votre base de donnée. 2. Connexion à la source de données

• Créer un objet de la classe CDatabase • Appeler la méthode Open Exemple : CDatabase db ; db.Open("NomSourceDonnees") ; ou bien : db.Open("ODBC;DSN= NomSourceDonnees;UID=NomUtilisteur ;PWD=MotPasse") ;

3. Création d’un jeu d’enregistrements

• Créer un objet de la classe CRecordset • Appeler la méthode Open Exemple : CRecordset rs(&db) ; rs.Open(option, "requetteSQL") ;

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 17: Programmation en VC++ MFC

© A. Benabbou

Si la table est en lecture seule alors il faut choisir l'option CRecordset::snapshot, sinon il faut choisir l'option CRecordset::dynaset. Le reste des opérations est le même que ce que nous avons vu pour les bases de données DAO.

8. Sérialisation d’objets La sérialisation d'une classe se déroule en 2 étapes • Dérivation d'une classe de CObject : La fonctionnalité et le protocole de sérialisation de base sont définis dans la classe CObject. En dérivant une classe de CObject (ou d'une classe dérivée de CObject) vous avez accès à la fonctionnalité et au protocole de sérialisation de la classe CObject. • Surcharge de la fonction virtuelle Serialize : La fonction membre Serialize, définie dans la classe CObject, est la fonction qui sérialise les données nécessaires pour capturer l'état actuel d'un objet. Elle comporte un argument CArchive qui sert à lire et à écrire les données se rapportant à l'objet. L'objet CArchive comporte une fonction membre, IsStoring(), qui détermine si la fonction Serialize stocke les données (écriture) ou charge ces dernières (lecture). À partir des résultats retournés par IsStoring(), on peut insérer les données de l'objet dans l'objet CArchive à l'aide de l'opérateur d'insertion (<<) ou les extraire de l'objet à l'aide de l'opérateur d'extraction (>>). Pour le mode binaire, on peut lire et écrire les données à l’aide des fonctions membres CArchive::Read et CArchive::Write au lieu des opérateurs >> et <<. Exemple : class Employe : public CObject { private: int code; CString nom; float salaire; public: Employe Serialize(CArchive &ar)

{ if(ar.IsStoring()) { ar<<code; ar<<nom; ar<<salaire; } else { ar>>code; ar>>nom; ar>>salaire; }

return *this ; } }; On peut maintenant utiliser la sérialisation des objets de la classe Employe comme suit:

//Sérialisation CFile f;

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.

Page 18: Programmation en VC++ MFC

© A. Benabbou

If(f.Open("test.dat",CFile ::modeCreate | CFile::modeWrite)) {

CArchive ar1(&f,CArchive::store); Employe y(100,"Ali",98777); y.Serialize(ar1);

} //Desérialisation CFile g; If(g.Open("test.dat",CFile::modeRead))

{ CArchive ar2(&g,CArchive::load);

Employe x; x.Serialize(ar2); x.print();

}

Please purchase PDFcamp Printer on http://www.verypdf.com/ to remove this watermark.