• Aucun résultat trouvé

Définir les attributs d’une police

N/A
N/A
Protected

Academic year: 2022

Partager "Définir les attributs d’une police"

Copied!
13
0
0

Texte intégral

(1)

1

Polices de caractères Boites de dialogues Classes conteneurs

2

Polices de caractères

3

Les polices de caractères

„

Qu’est ce qu’une police ?

„

Définir les attributs d’une police

„

La méthode CFont::CreateFont

„

Hauteur, largeur et jeu de caractères

„

Attributs affectant la sortie des caractères

„

Les autres attributs

„

Les polices prédéfinies

„

Création d’une police avec LOGFONT

„

Le dessin du texte

„

Méthodes CDC pour le dessin de texte

4

Qu’est ce qu’une police

„

Une police de caractères est une série de caractères et autres symboles ayant les mêmes attributs.

„ Sous MFC les polices (CFont) sont des objets CGdiObject comme les crayons (CPen) et les pinceaux (CBrush)

„

Il y a deux manières d’utiliser les polices :

„ Spécifier exactement quelle police utiliser

„ Spécifier les caractéristiques générales de la police et laisser Windows choisir pour vous

„

Il existe trois types de polices :

„ Les polices matricielles ou bitmap (raster en anglais)

„ Polices dépendantes du matériel

„ Les polices vectorielles

„ constituées d’une série de courbes.

„ Polices indépendantes du matériel, mais lentes à charger et utiliser

„ Les polices TrueType : Les polices les plus polyvalentes sous Windows.

„ Stockées dans des fichiers d’extension .TTF

5

Définir les attributs d’une police

„ De deux manières :

„ En appelant la fonction CFont::CreateFont et en passant en argument les attributs de la police

„ En décrivant la police à l’aide d’une structure LOGFONT, puis en passant la structure à la fonction CFont::CreateFontIndirect pour créer la police

„ La structure LOGFONT n’est pas une police, mais la description d’une police contenant des membres pour tous les attributs de la police.

typedef struct tagLOGFONT { LONG lfHeight;

LONG lfWidth;

LONG lfEscapement;

LONG lfOrientation;

LONG lfWeight;

BYTE lfItalic;

BYTE lfUnderline;

BYTE lfStrikeOut;

BYTE lfCharSet;

BYTE lfOutPrecision;

BYTE lfClipPrecision;

BYTE lfQuality;

BYTE lfPitchAndFamily;

TCHAR lfFaceName[LF_FACESIZE];

} LOGFONT; 6

Définir les attributs d’une police

„

Pour utiliser LOGFONT, on remplit un objet de ce type puis on le passe à la fonction CFont::CreateFontIndirect :

„

LOGFONT lf ;

„

ZeroMemory(&lf, sizeof(lf)) ; //initialisation

„

Lf.lfWeight = FW_BOLD ;

„

Lf.lfHeight = 300 ;

„

Lf.lfWidth = 50 ;

„

CFont fnt ;

„

fnt.CreateFontIndirect(&lf) ;

(2)

7

Définir les attributs d’une police

„ BOOL CreateFont(

intnHeight, //Hauteur intnWidth, //Largeur intnEscapement, //Angle intnOrientation, //Orientation intnWeight, //Epaisseur BYTEbItalic, //Italique BYTEbUnderline, //Souligné BYTEcStrikeOut, //Barré

BYTEnCharSet, //Jeu de caractères BYTEnOutPrecision, //Précision de sortie BYTEnClipPrecision, //Précision de clipping BYTEnQuality, //Qualité

BYTEnPitchAndFamily, //Famille LPCTSTRlpszFacename); // Nom de la police

8

Définir les attributs d’une police

CFont fnt ;

fnt.CreatFont(100, // Hauteur

0, // Largeur

0, // Angle

0, // Orientation

FW_BOLD, // Epaisseur

TRUE, // Italique

FALSE, // Souligné

FALSE, // Barré

ANSI_CHARSET, // Jeu de caractères OUT_DEFAULT_PRECIS,// Précision de sortie CLIP_DEFAULT_PRECIS,// Précision de clipping DEFAULT_QUALITY, // Qualité

DEFAULT_PITCH, // Famille

’’ Arial’’ // Nom de police ) ;

9

Hauteur, largeur et jeu de caractères

„

Les attributs hauteur (nHeight) et largeur (nWidth) peuvent avoir une valeur :

„Nulle (0) : Une police par défaut est alors utilisée. C’est Windows qui décide.

„Non Nulle : Windows tente de trouver parmi les polices disponibles, une police ayant des valeurs proches de ce qui est indiqué

„

Les jeux de caractères (nCharset) disponibles sont :

„ANSI_CHARSET

„DEFAULT_CHARSET : le nom de la fonte est utilisé pour définir le jeu de caractères

„OEM_CHARSET : utilisé principalement pour les programmes en mode console

„SYMBOL_CHARSET : sert à afficher des symboles tels que ceux utilisés dans les formules mathématiques

„

10

Attributs affectant la sortie des caractères

„ Précision de sortie(nOutPrecision) : Indique dans quelle mesure la police renvoyée par Windows doit correspondre aux attributs demandés :

„ OUT_DEFAULT_PRECIS Windows choisit une police raisonnable

„ OUT_STRING_PRECIS La police choisie par Windows correspond à la taille spécifiée

„ OUT_CHARACTER_PRECIS La police choisie par Windows correspond à tous les attributs sauf l’orientation et l’angle

„ OUT_STROKE_PRECIS La police choisie par Windows correspond à tous les attributs spécifiés

„

„ Précision de clipping(nClippingPrecision): Indique comment sont traités les caractères lorsque une partie d’entre eux est masqué.

„ CLIPP_DEFAULT_PRECIS Windows choisit une police raisonnable, elle est équivalente à passer zéro comme paramètre

„ CLIPP_CHARACTER_PRECIS Chaque caractère peut être masqué séparément

„ CLIPP_STROKE_PRECIS Les caractères peuvent être partiellement masqués

„

11

Attributs affectant la sortie des caractères

„ Qualité d’une police

(nQuality)

:Indique dans quelle mesure les attributs logiques doivent correspondre à sa représentation physique

„DEFAULT_QUALITY : Windows choisit une police raisonnable

„DRAFT_QUALITY : La vitesse de sortie est prioritaire par rapport à la qualité d’impression

„PROOF_QUALITY : La qualité de sortie est prioritaire par rapport à la vitesse et la précision des attributs logique de la police

„ L’attribut famille d’une police

(nPitchAandFamily) :

„ 6 familles de police

„FF_DECORATIVE, FF_DONTCARE, FF_MODERNE, FF_ROMAN, FF_SCRIPT, FF_SWISS

12

Les autres attributs

„ Epaisseur (nWeight) : valeurs allant de 0 à 1000.

„ La valeur 400 correspond à une police normale.

„ La valeur 700 correspond à une police en gras.

„ Si la valeur est 0, Windows utilise une épaisseur raisonnable.

„ Voici les noms symboliques prédéfinis:

FW_THIN (100), FW_LIGHT(300), FW_NORMAL(400), FW_MEDIUM (500), FW_SEMIBOLD (600), …

„ Angle (nEscapement) : mesuré en dixième de degré. Avec une valeur d’angle de 900, le texte subira une rotation de de 90°

„ Orientation(nOrientation) : analogue à l’angle mais s’applique séparément à chaque caractère

„ Italique (nItalic), souligné(nUnderline)et barré(nStrikeOut):

„ Ces attributs sont affectés à une police à l’aide de TRUE et FALSE

(3)

13

Les polices prédéfinies

„

Windows dispose de six polices prédéfinies :

„ANSI_FIXED_FONT

„ANSI_VAR_FONT

„DEVICE_DEFAULT_FONT

„OEM_FIXED_FONT

„DEFAULT_GUI_FONT : police par défaut des éléments de l’interface tels que les menus et boîtes de dialogues

„SYSTEM_FONT : la police système

„ Sélectionner une police prédéfinie : CFont* pOldFont = static_cast<CFont*>

(pDC->SelectStockObject(SYSTEM_FONT)) ;

„ La boite de dialogue de sélection de police :

„ La boîte de dialogue de changement de police vous permet de mettre à la disposition de l’utilisateur un moyen de changer de police, ou de changer ses attributs (couleur, styles, …)

14

Création d’une police avec CFont

„

Le code suivant montre comment créer une police Arial à l’aide de CFont et CreateFont.

„ Tous les paramètres ont la valeur zéro, sauf le nom.

„ Le code demande à Windows de sélectionner une police « raisonnable » et de l’appeler Arial.

void CIHMView::OnDraw(CDC* pDC) { CFont fntArial;

fntArial.CreateFont( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Arial");

CString szMsg = "Message affiché avec la police Arial";

CFont* pOldFont = pDC->SelectObject( &fntArial );

pDC->TextOut( 0, 50, szMsg );

// Restauration de l'ancien objet GDI pDC->SelectObject( pOldFont );

}

15

Création d’une police avec LOGFONT

void CIHMView::OnDraw(CDC* pDC) { CRect rcClnt;

GetClientRect( rcClnt );

// rcClnt =rectangle de la zone client de la fenêtre pDC->DPtoLP( rcClnt );

// ajustement des systèmes de coordonnées logiques et de dessin COLORREF clrOld = pDC->SetTextColor( m_clrSelection );

// choix de la couleur du texte

int nOldMode = pDC->SetBkMode( TRANSPARENT );

// choix de la couleur du fond

CString szMsg = "Message affiché avec la police Arial";

//message à afficher

16

Création d’une police avec LOGFONT

CFont fntArial;

LOGFONT lf;

// intitialisation de la structure LOGFONT ZeroMemory( &lf, sizeof(LOGFONT) );

lstrcpy( lf.lfFaceName, "Arial" );

// Création de la fonte

fntArial.CreateFontIndirect( &lf );

//sélection de la fonte

CFont* pOldFont = pDC->SelectObject( &fntArial );

// écriture du message au milieu de la zone client pDC->TextOut(rcClnt.Width()/2,rcClnt.Height()/2,szMsg);

// restauration des anciennes valeurs pDC->SelectObject( pOldFont );

pDC->SetTextColor( clrOld );

pDC->SetBkMode( nOldMode );

}

17

Le dessin du texte

„ Le contexte de dessin de la vue en cours comporte

„ une police par défaut (SYSTEM_FONT),

„ une couleur de texte et une couleur de fond.

„ Les méthodes

„ GetTextColor, SetTextColor, GetBkColor et SetBkColor de la classe CDC

„ permettent de changer et de connaître de la couleur du texte et de fond

„ On a souvent besoin d’interroger le contexte de périphérique

„ sur les dimensions du texte avant que MFC n’appelle la fonction OnDraw

„ Pour déterminer ces dimensions, on fait appel à la méthode CDC::GetTextMetric

„ afin d’obtenir un objet TEXTMETRIC.

„ puis nous utilisons les informations contenues dans cette structure pour calculer des informations utiles comme la hauteur de lignes, la largeur de caractères, …

18

Le dessin du texte

„

voici une version partielle de la structure TEXTMETRIC :

typedef struct tagTEXTMETRIC {

int tmHeight;

int tmAscent;

int tmDescent;

int tmInternalLeading;

int tmExternalLeading;

int tmAveCharWidth;

int tmMaxCharWidth;

int tmWeight;

BYTE tmItalic;

BYTE tmUnderlined;

} TEXTMETRIC; …

(4)

19

Méthodes de la classe CDC pour le dessin de texte

„

TextOut : prend en argument la position en x et y et le texte à dessiner

„

DrawText : Préciser un rectangle dans lequel on souhaite que le texte soit dessiné. Il est possible de préciser l’alignement à droite, à gauche, centré, justifié

„

ExttextOut : Très proche de TextOut, qui, comme Drawtext, vous permet de dessiner dans un rectangle circonscrit

„

TabbedTextOut : Pour introduire des tabulations dans le texte

„

GetTextExtent : retourne la hauteur et la largeur d’une ligne de texte en fonction de la police du caractères utilisée.

20

Boites de Dialogue et contrôles

21

Introduction

„ Une boîte de dialogue est destinée à fournir des informations à l'utilisateur ou à lui en demander.

„ La démarche habituelle est de définir dans les menus (ou les barres à outils) une commande qui ouvre une boîte de dialogue.

„ La boîte de dialogue est créée, initialisée et affichée par le gestionnaire de la commande. Puis à la fermeture de la boîte par l'utilisateur, le gestionnaire récupère les informations si nécessaire.

„ Un contrôle est une petite fenêtre incluse dans une boîte de dialogue.

„ Les contrôles sont destinés à afficher ou à récupérer de l'information.

„ Il existe plusieurs groupes de contrôles dans Windows : 15 contrôles communs ont été introduits dans Windows 95.

„ De nouveaux contrôles ont ensuite été introduits comme les contrôles de Microsoft ActiveX.

22

Introduction

„ Sur cette fenêtre classique d'impression, on peut remarquer plusieurs types de contrôles comme

„ les zones de listes (ex : pour les différents noms d'imprimantes définies),

„ les cases à cocher (ex: copies assemblées),

„ les compteurs (ex : nombre de copies),

„ les cases à options (ex: tout, page en cours, pages : avec exclusion mutuelle entre les options),

„ les boutons de commandes(ok, annuler)

„ les boutons de commandes qui provoquent l'ouverture d'autres boîtes de dialogue (ex : Options, Prorpiétés)

„ des zones de texte (pour afficher ou saisir du texte).

23

Les boîtes de dialogues et les contrôles

„

Les boîtes de dialogue et les contrôles sont

„

des fenêtres avec les possibilités de les déplacer, les afficher, les marquer, de changer leurs attributs, etc …

„

Les boîtes de dialogue sont décrites dans les MFC par la classe CDialog.

„

CObject Æ CCmdTarget ÆCWnd Æ CDialog Æ CCommonDialog Æ user dialog boxes

24

Les boîtes de dialogues et les contrôles

„

Chaque contrôle est décrit dans une classe dédiée.

CObject Æ CCmdTarget ÆCWnd

Æ

CButton

Æ CComboBox Æ CListBox Æ CStatic Æ CEdit

„

Toutes ces classes (boîtes de dialogue et contrôles)

„

héritent de la classe CWnd

„

et peuvent donc disposer de tables de message et de

gestionnaires associés.

(5)

25

Création d'une boîte de dialogue modale pour afficher des informations

„

Nous allons compléter le programme

précédemment décrit en construisant deux boîtes de dialogue d'affichage d'informations pour les deux options :

„

Dessin Æ Rectangle

„

Dessin Æ Cercle

„

Ces deux boîtes ne font qu'afficher respectivement les messages :

„

Je suis un rectangle !

„

Je suis un cercle !

„

Dans une fenêtre possédant un bouton OK et un titre = "Dessin".

26

Création d'une boîte de dialogue modale pour afficher des informations

„

Cette construction se décompose en 2 étapes principales :

„

La création des boîtes de dialogue en utilisant l'éditeur de ressources,

„

La description des gestionnaires associés aux deux options du menu Dessin (Rectangle et Cercle).

27

Création de la boîte de dialogue avec l'éditeur de ressources

„

L’insertion d’une ressource peut se faire par

„ le menu Insert ->

Resource puis Dialog

„ ou le menu contextuel de la ressource Dialog

„ Sur l’onglet Resource View

„

Une boîte de dialogue par défaut est générée.

28

Création de la boîte de dialogue avec l'éditeur de ressources

„

Une boîte de dialogue par défaut est proposée.

„

Cette boîte comporte les deux boutons OK et Cancel.

„

Par défaut, l'identifiant associé à cette boîte est IDD_DIALOG1 et le titre de la fenêtre "Dialog"

avec une possibilité de fermeture de la fenêtre.

„

Cette fenêtre peut être modifiée,

„

on peut ajouter ou supprimer des contrôles en utilisant la barre à outils des contrôles.

29

Création de la boîte de dialogue avec l'éditeur de ressources

„

Cette barre à outils comporte des contrôles :

„

Des labels (Static Text)

„

Des zones d’édition (Edit Box, Rich Box)

„

Des boutons (Button)

„

Des boutons radio (Radio Button)

„

Des cases à cocher (Check Box)

„

Des listes déroulantes (List, Combo List)

„

Des barres de défilement (Horizontal Scroll Bar, Vertical Scroll Bar)

„

Des barres de progression (Progress)

„

Des boutons à glisser (Slider)

„

30

Création de la boîte de dialogue avec l'éditeur de ressources

„

On modifie

„ le nom de l'identifiant par défaut (IDD_DESSIN_RECT)

„ le titre de la fenêtre ("Dessin") en prenant l'option propriété associée à la fenêtre de dialogue,

„ ainsi que la fonte d'écriture : Times New Roman.

„

Puis on ajoute un

contrôle de type Static

Text pour mettre le

message souhaité.

(6)

31

Création de la boîte de dialogue avec l'éditeur de ressources

„ Le code associé à cette ressource est généré automatiquement par l'éditeur de ressources dans le fichier IHM.rc

IDD_DESSIN_RECT DIALOGEX 0, 0, 186, 95

STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dessin"

FONT 8, "Times New Roman"

BEGIN

DEFPUSHBUTTON "OK",IDOK,68,66,50,14 CTEXT "Je suis un Rectangle!" , IDC_STATIC,17,20,146,25,

SS_CENTERIMAGE,WS_EX_STATICEDGE END

32

Création de la boîte de dialogue avec l'éditeur de ressources

„ Le même traitement est effectué pour créer une fenêtre de dialogue pour l'option cercle.

33

Création de la classe associée à la boîte de dialogue

„

Après la création des ressources boîtes de dialogue,

„ il faut définir des classes héritières de la classe CDialog pour la gestion de ces nouvelles ressources.

„

Ce travail peut être fait en choisissant l'option ClassWizard du menu contextuel proposé avec la boîte de dialogue.

34

Création de la classe associée à la boîte de dialogue

„ On peut alors choisir le nom de la classe souhaitée : CRectDialog.

„ On obtient alors la fenêtre suivante :

„ La méthode DoDataExchange doit être surchargée, elle est donc automatiquement sélectionnée (et son code est généré).

35

Création de la classe associée à la boîte de dialogue

„

Après validation de cette fenêtre, le code suivant est généré

„ CRectDialog.h

/////////////////////////////////////////////////////////////////////////////

// CRectDialog dialog

class CRectDialog : public CDialog {

public:

CRectDialog(CWnd* pParent = NULL);

enum { IDD = IDD_DESSIN_RECTANGLE };

protected:

virtual void DoDataExchange(CDataExchange* pDX) DECLARE_MESSAGE_MAP()

};

36

Création de la classe associée à la boîte de dialogue

„ RectDialog.cpp

// RectDialog.cpp : implementation file

#include "stdafx.h"

#include "IHM.h"

#include "RectDialog.h“

//////////////////////////////////////////////////////////////////////

// CRectDialog dialog

CRectDialog::CRectDialog(CWnd* pParent /*=NULL*/) : CDialog(CRectDialog::IDD, pParent)

{

}

(7)

37

Création de la classe associée à la boîte de dialogue void CRectDialog::DoDataExchange(CDataExchange* pDX) {

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CRectDialog)

// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CRectDialog, CDialog) END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////

// CRectDialog message handlers

38

Création de la classe associée à la boîte de dialogue

„

Lorsque la classe a été créée, on peut lui ajouter des événements si nécessaire.

„

On peut faire ces ajouts en choisissant l'option Event du menu contextuel associé à la boîte de dialogue.

39

Création de la classe associée à la boîte de dialogue

„

Dans notre cas, la fenêtre ne gère pas de message, donc cette étape n'est pas nécessaire.

„

La construction de la fenêtre de dialogue et de sa classe associée est à présent terminée.

„

On va donc créer les gestionnaires d'événements qui vont utiliser ces ressources (donc qui vont afficher les boites).

40

Création des gestionnaires de messages

„ La création du gestionnaire peut se faire de 2 façons :

„ Menu contextuel dans l’ed. de ressources -> Ajouter un gestionnaire d’évènement …

„ Menu contextuel associé à la classe CIHMView -> Ajouter un gestionnaire d’événement ...

41

Création des gestionnaires de messages

„

Puis en choisissant l'option AddHandler

„

Après sélection de l’ID de l’évènement à gérer, un nom de gestionnaire est automatiquement proposé ici : OnDessinRect.

„

En éditant le code généré, on a : void CIHMView::OnDessinRect() {

// TODO: Add your command handler code here

}

42

Création des gestionnaires de messages

„

On doit ici choisir le code du gestionnaire souhaité.

Nous allons simplement déclarer un objet de type CRectDialog et exécuter la méthode DoModal sur cet objet.

void CIHMView::OnDessinRect() { CRectDialog crdlg;

crdlg.DoModal();

}

void CIHMView::OnDessinCercle() { CCercleDialog ccdlg;

ccdlg.DoModal();

}

(8)

43

Création des gestionnaires de messages

„

La méthode DoModal() permet de d'exécuter une fenêtre de dialogue en mode modal

„

i.e. qui impose à l'utilisateur de traiter la fenêtre (en cliquant sur OK ou en la fermant dans l'exemple décrit) avant de poursuivre les traitements.

„

Dans le fichier IHMView.cpp, on a donc les informations suivantes :

#include "RectDialog.h"

#include "CercleDialog.h"

BEGIN_MESSAGE_MAP(CIHMView, CView) ON_COMMAND(ID_DESSIN_RECT, OnDessinRect) ON_COMMAND(ID_DESSIN_CERCLE, OnDessinCercle)

………

END_MESSAGE_MAP()

44

Exécution de l’application

45

Affichage d'une boîte de dialogue et récupération de son contenu

„

Lorsqu'une boîte de dialogue contient

„ des zones d'éditions ou d’autres contrôles permettant de « saisir

» des informations,

„ il est alors nécessaire de récupérer les valeurs saisies à la fermeture de la boîte de dialogue.

„

Exemple: création d’une boîte de dialogue qui permet la saisie d'un titre.

46

Affichage d'une boîte de dialogue et récupération de son contenu

„

Cette fenêtre comporte une fenêtre d'édition pour saisir le titre dont les propriétés sont les suivantes :

47

Affichage d'une boîte de dialogue et récupération de son contenu

„

Création de la classe associée à cette ressource

48

Affichage d'une boîte de dialogue et récupération de son contenu

„

Ajout d'une variable dans la classe CRectTitreDialog

„ Pour gérer la zone d'édition, on va utiliser une variable pour stocker le titre saisi.

„

Pour cela, on sélectionne dans le menu contextuel de la boîte de dialogue, l'option ClassWizard.

„ Avec l'option Add Variable, on obtient :

(9)

49

Affichage d'une boîte de dialogue et récupération de son contenu

„

Après cet ajout de variable, la classe CRectTitreDialog est donc :

class CRectTitreDialog : public CDialog {

public:

CRectTitreDialog(CWnd* pParent = NULL);

enum { IDD = IDD_RECT_TITRE };

CString m_titre_rect;

protected:

virtual void DoDataExchange(CDataExchange* pDX);

DECLARE_MESSAGE_MAP()

};

50

Affichage d'une boîte de dialogue et récupération de son contenu

„ Modification du gestionnaire de message pour cette commande Dessin Rectangle (* dans la classe CIHMView *)

„ Tout d'abord on définit dans cette classe un attribut pour stocker le titre qui sera saisi dans la boîte de dialogue.

„ On peut ensuite définir le gestionnaire.

void CIHMView::OnDessinRect() {

CRectTitre crtdlg;

crtdlg.m_titre_rect = "titre";

if (crtdlg.DoModal() == IDOK) { m_titre_rect = crtdlg.m_titre_rect;

} }

51

Affichage d'une boîte de dialogue et récupération de son contenu

„

La 1ère ligne déclare un objet de type CRect_Titre.

„

Puis l'attribut m_rect_titre de cet objet est initialisé à la chaîne "titre".

„

Cette valeur s'affichera par défaut dans la boîte d'édition lors de son exécution.

„

L'instruction DoModal() sur l'objet crtdlg crée la fenêtre, l'affiche et la gère tant que l'utilisateur ne la ferme pas par OK (ou par un clique sur la croix de fermeture).

„

Lorsque l'utilisateur valide par OK la fenêtre, MFC récupère les données de la boîte de dialogue dans ses variables.

„

Ces valeurs peuvent alors être récupérées.

„ C'est le rôle de l'affectation :

„ m_titre_rect = crtdlg.m_titre_rect;

„ Cette valeur peut alors être utilisée dans la classe CIHMView. 52

Affichage d'une boîte de dialogue et récupération de son contenu

„

Pour vérifier cette affectation,

„

on ré-affecte cette valeur comme valeur par défaut à une deuxième boîte de dialogue

„

que l'on ré-exécute après avoir saisi le titre :

„"Vive IHM !".

void CIHMView::OnDessinRect() { CRectTitreDialog crtdlg1,crtdlg2;

crtdlg1.m_titre_rect = "titre";

if (crtdlg1.DoModal() == IDOK) {m_titre_rect = crtdlg1.m_titre_rect;

}

crtdlg2.m_titre_rect = m_titre_rect;

crtdlg2.DoModal();

}

53

Affichage d'une boîte de dialogue et récupération de son contenu

„

Ce mécanisme d'échange de valeurs entre la classe mère ici CIHMView et la boîte de dialogue ic CRect_Titre_Dialog s'appelle DDX.

„

DDX : Dialog Data Exchange

„

MFC simplifie la récupération d'informations dans une boîte de dialogue grâce à ce mécanisme DDX.

„

Ce mécanisme est mis en œuvre par la fonction :

„

CRect_Titre_Dialog :: DoDataExchange (surchargée dans cette classe)

„

Cette fonction est donc complétée en ajoutant des appels de fonction DDX et DDV (Dialog Data Validation).

54

Affichage d'une boîte de dialogue et récupération de son contenu

„

La méthode DoDataExhange

void CRectTitreDialog::DoDataExchange(CDataExchange*

pDX) {

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CRectTitreDialog)

DDX_Text(pDX, IDC_EDIT1, m_titre_rect);

DDV_MaxChars(pDX, m_titre_rect, 70);

//}}AFX_DATA_MAP }

„

Lien entre le composant zone d’édition identifié par

IDC_EDIT1 et la variable associée dans la classe

m_titre_rect et contrainte sur le nombre de caractères

maximum à saisir dans la zone.

(10)

55

Affichage d'une boîte de dialogue et récupération de son contenu

„

Le paramètre pDX de la méthode DoDataExchange

„ est un pointeur vers un objet de type CDataExchange

„ et contient des informations sur la manière dont sont transférées les données :

„des variables de la classe vers les contrôles (initialisation)

„ou des contrôles vers les variables (récupération).

„

DoDataExchange gère également le mécanisme DDV (Dialog Data Validation).

„

DDV permet la vérification de certaines contraintes de saisie,

„ par exemple ici le titre est limité à 70 caractères.

„

Si cette taille est dépassée,

„ un message d'erreur est affiché et MFC attend que l'erreur soit corrigée.

56

Affichage d'une boîte de dialogue et récupération de son contenu

„

Quand l'appel à la fonction DoDataExchange est-il réalisé ?

„

Lors de l'affichage de la boîte de dialogue, MFC appelle la fonction

„

CDialog :: OnInitDialog

„

Par défaut OnInitDialog appelle :

„CWnd :: UpdateData avec un paramètre à False qui signale un transfert de données DDX vers les contrôles.

„UpdateData appelle DoDataExchange

„

Quand l'utilisateur valide la fenêtre par OK,

„le gestionnaire OnOK appelle UpdateData avec un paramètre égal à true qui indique un transfert DDX du contrôle vers l'objet dialogue.

57

Les boîtes de dialogue communes

„

MFC propose 6 boîtes de dialogue communes avec MFC.

„

CWnd Æ CDialog Æ CCommonDialog

„Æ

CColorDialog

„Æ

CFileDialog

„Æ

CFontDialog

„Æ

CPageSetupDialog

„Æ

CPrintDialog

„Æ

CFindReplaceDialog

58

Les boîtes de dialogue communes La boîte de dialogue des couleurs

„ Données membres

„ m_ccUne structure pour conserver les valeurs de la boîte.

„ Construction

„ CColorDialogConstructeur

„ Operations

„ DoModal Affiche la boîte de dialogue et permet à l'utilisateur de faire son choix.

„ GetColorRetourne une structure COLORREF contenant les valeurs de la couleur sélectionnée.

„ GetSavedCustomColorsRetourne les couleurs créées par l’utilisateur.

„ SetCurrentColorAffecte la couleur courante à la couleur spécifiée.

„ Opération surchargeable

„ OnColorOKA surcharger pour valider la couleur sélectionnée.

59

Les boîtes de dialogue communes Les boîtes Ouvrir et Enregistrer sous

„

CWnd

Æ

CDialog

Æ

CCommonDialog

Æ

CFileDialog

„

Par une déclaration et une exécution de la forme :

„ CFileDialog cfdlg(TRUE);

„ cfdlg.DoModal();

„

On obtient la boîte de dialogue : Ouvrir

„

Par une déclaration et une exécution de la forme :

„ CFileDialog cfdlg(FALSE);

„ cfdlg.DoModal();

„

On obtient la boîte de dialogue : Enregistrer Sous

60

Les boîtes de dialogue communes La boîte de dialogue Police

„ CWndÆCDialogÆ CCommonDialogÆCFontDialog

„ Méthodes :

„ DoModalAffiche la boîte de dialogue et permet la sélection.

„ GetCurrentFontretourne le nom de la police courante

„ GetStyleNameretourne le style de la police

„ GetSizeretourne la taille de la police

„ GetColorretourne la couleur de la police sélectionnée

„ IsUnderlineTeste si on est en souligné

„ IsBoldTeste si la police est en gras

„ IsItalicTeste si la police est en italique

„

(11)

61

Les boîtes de dialogue communes La boîte de dialogue de Mise en page

„

CWnd Æ CDialog Æ CCommonDialog Æ CPageSetupDialog

62

Les boîtes de dialogue communes Les boîtes de dialogue d’impression

„

CWnd Æ CDialog Æ CCommonDialog Æ CPrintDialog

„

Avec une déclaration CPrintDialog

cpdlg(TRUE),

„

on a la boîte Configuration de l’impression

„

Avec une déclaration CPrintDialog(FALSE),

„

on a la boîte Impression

63

Les boîtes de dialogue communes

Les boîtes de dialogue de recherche/remplacement

„

CWnd

Æ

CDialog

Æ

CCommonDialog

Æ

CFindReplaceDialog

„

Ces fenêtres ne peuvent pas être exécutées en mode modal par la fonction DoModal.

„

Ce sont les fenêtres de recherche et de remplacement de texte.

64

Classes Conteneurs

65

Les classes conteneurs

„

Définition : des classes MFC permettant de stocker un ensemble de données d’une quantité arbitraire, structurées d’une façon particulière.

„

Type de conteneurs :

„ Tableau :

„Accès indexé

„Taille adaptative

„Éléments ordonnés

„ Liste :

„Listes doublement chaînées

„Rapide et facile à utiliser, mais recherche lente

„ Association :

„A chaque élément est associée une clé

„Stockage et recherche rapide

„Clé unique difficile à mettre en œuvre

66

Les classes conteneurs (2)

„

Conteneurs : Conteneurs d’objets/Conteneurs de pointeurs désignant des objets.

„

Les conteneurs d’objets sont mis en œuvre par les classes patron CArray, CList et CMap, qui sont toutes dérivées de CObject

„

Les conteneurs de pointeurs typés stockent des pointeurs désignant des objets, plutôt que les objets eux-mêmes.

C’est la différence entre les patrons conteneurs d’objets et les patrons conteneurs de pointeurs.

„

Les conteneurs de pointeurs sont mis en œuvre par les

classes patron CTypedPtrArray, CTypedPtrList et

CTypedPtrMap

(12)

67

La classe patron CArray

„ Déclaration: Pour définir un conteneur d’objets CPoint, il faut écrire : CArray<CPoint, CPoint&> PointArray ;

Le CPoint& indique que lorsque vous appelez des fonctions membres de cet objet, l’argument est transmis par référence

„ Pour ajouter un point : PointArray.Add(aPoint) ;

„ Pour avoir le troisième élément du tableau : aPoint = PointArray[2] ;

aPoint = PointArray.GetAt(2) ;

„ Quelques fonctions membres

„ GetSize: Retourne le nombre d’éléments

„ GetUpperBound: Retourne le plus grand index

„ SetSize: Change la taille

„ RemoveAll: Efface tous les éléments

„ GetAt: Retourne l’élément d’un index donné

„ SetAt: Change l’élément d’un index donné, l’index doit être inférieur à la taille max

68

La classe patron CArray (2)

„ Fonctions membres (suite) :

„ SetAtGrow: Change l’élément d’index donné, agrandit le tableau si nécessaire.

„ Add: Ajoute un élément au tableau, agrandit le tableau si nécessaire.

„ Append: Ajoute un tableau à un autre, agrandit le tableau résultant si nécessaire.

„ Copy: Copie un tableau dans un autre, agrandit le tableau résultant si nécessaire.

„ InsertAt: Insère un élément à un index donné.

„ RemoveAt: Efface un élément à un index donné.

„ Fonctions d’appoint = fonctions globales que vous pouvez redéfinir:

„ ConstructElements: Alloue la mémoire pour le nombre d’éléments à stocker initialement dans le tableau

„ DestructElements: Appelé par les fonctions membres qui suppriment les éléments du tableau. Sa version par défaut n’a aucun effet, en conséquence si le constructeur de l’objet à supprimer alloue de la mémoire dans le tas, il faut redéfinir cette fonction

69

La classe patron CList

„ Déclaration : Fournir 2 arguments: le type d’objets à stocker, ainsi que la manière dont un objet doit être défini dans les arguments de fonctions. CList<ObjectType, ObjectType&> aList ;

„ Déclarer une liste de points : CList<CPoint, CPoint&> PointList

„ Le type POSITION : les objets de ce type précise les positions des objets dans la liste

„ Ajouter des éléments

„AddHead: Ajoute l’élément fourni en argument en tête de liste PointList.AddHead(aPoint) ;

„AddTail: Ajoute l’élément fourni en argument en fin de liste.

PointList.AddTail(aPoint) ;

„InsertBefore : insère un élément avant une position spécifique PointList.InsertBefore(aPosition, aPoint) ; Ces trois fonctions retournent la position du nouvel objet

70

La classe patron CList (2)

„ Extraire des éléments

„ GetNext : retourne l’objet courant et incrémente la variable de position qui lui est transmise, de sorte qu’elle désigne l’objet suivant dans la liste. Cette variable prend la valeur NULL si vous extrayez le dernier élément de la liste.

„ Pour attribuer une valeur particulière à un objet d’une liste, utilisez la fonction SetAt.

PointList.SetAt(aPosition, aPoint) ;

„ Les fonctions GetHeadPosition et GetTailPosition permettent d’obtenir la valeur POSITION de début ou de la fin de la liste

„ Itération dans une liste : CPoint CurrentPoint(0,0) ;

POSITION aPos = PointList.GetHeadPosition() ; while (aPos) {

CurrentPoint = PointList.GetAt(aPos) ; // Traitement de l’objet en cours CurrentPoint }

71

La classe patron CList (3)

„ Recherche dans une liste :

„Find : cherche un élément de la liste et retourne sa position. Elle fait appel à la fonction patron globale CompareElements

POSITION aPos = PointList.Find(ThePoint) ;

„ CompareElements :

template< class TYPE, class ARG_TYPE >

BOOL CompareElements(const TYPE* pElement1, const ARG_TYPE* pElement2 );

„ Pour le conteneur PointList, le prototype de cette fonction généré par le patron est :

BOOL CompareElements(CPoint* pPoint1, CPoint* pPoint2) ;

„ Pour comparer des objets CPoint :

BOOL CompareElements(CPoint* pPoint1, CPoint* pPoint2) {return *pPoint1 == *pPoint2 ;}

à condition d’avoir défini l’opérateur == pour la classeCPoint. 72

La classe patron CList (4)

„ Savoir combien d’objets dans la liste: GetCount

„ Quatre fonctions pour supprimer les objets d’une liste :

„ RemoveHead : supprimer le premier élément If(!PointList.IsEmpty()) PointList.RemoveHead()

„ RemoveTail : supprimer le dernier élément

„ RemoveAt : Si vous connaissez la position de l’objet à supprimer PointList.RemoveAt(aPosition) ;

„ RemoveAll : Supprimer tout le contenu d’une liste. Cette fonction libère la mémoire qui a été allouée aux éléments de la liste

„ Fonctions d’appoint

En plus de la fonction CompareElements, les membres de la classe CList utilisent deux autres fonctions d’appoint ConstructElements et DestructElements. La première fonction est appelée à chaque fois qu’un objet est inséré dans la liste. La deuxième chaque fois qu’un élément de la liste est supprimé.

(13)

73

La classe patron CTypedPtrList

„ Déclarer une liste de pointeurs :

CTypedPtrList<BaseClass, Type*> ListName ;

Classe de base : utiliser CObList pour une liste qui prend en charge des pointeurs sur des objets dérivés de CObject. Utiliser CPtrList pour gérer une liste de pointeurs void* .

Par exemple, une liste de pointeurs sur des objets de type Elements : CTypedPtrList<CObject, CElement*> ElementList ;

„ Fonctions membres :

„ GetHead, GetTail, GetNext, GetPrev, GetAt, GetHeadPosition, GetTailPosition, GetCount

„ RemoveHead, RemoveTail, RemoveAll, RemoveAt

„ AddHead, AddTail,SetAt, InsertBefore, InsertAfter

„ Find, FindIndex

„ IsEmpty

74

Les classes patron : Conclusion

„

La bibliothèque MFC

„

offre un large éventail de classes patron

„CArray, CList et CMap

„CTypedPtrArray, CTypedPtrList et CTypedPtrMap

„

qui permettent de gérer des « ensembles » d’objets,

„

avec de nombreuses méthodes.

Références

Documents relatifs

● Ce sac contient tout le matériel portable nécessaire afin que chaque agent soit indépendant et autonome. ● « On en prend soin car ce kit indispensable nous permet de

Suivant ainsi celui de Carouge, de la Ville de Genève, de Vernier, de Meyrin, de Plan-Les- Ouates et de Lancy, le CLS conclu avec Thônex resserre un peu plus le maillage sécuritaire

Il y a plusieurs années, un nouvel instrument de revalorisation du logement a fait son apparition dans le Code wallon de l’habitation durable : il s'agit de la prise en gestion ou

Les colorants se fixent à la surface du cheveu et se superposent aux pigments mélaniques. COLORANTS DIRECTS

On s’explique dès lors l’existence d’une institution comme la préfecture de police, celle de Paris, qui incarne l’organisation spécifique de la police de

Les possibilités d’accès du public sont multiples ; le piéton pourra utiliser l’escalier principal situé le long de la route de Trèves – après avoir éventuellement stationné

Les associations sont tenues de faire connaître, dans les trois mois, tous les changements survenus dans leur administration ou leur direction, ainsi que toutes les

Pour demander sa retraite de base c’est déjà possible : selon l’Assurance retraite un tiers des nouveaux retraités ont rempli leur dossier de retraite en ligne en 2019..