L'affichage de texte
Afficher le texte
Tout d'abord, il faut savoir que votre programme utilise des valeurs par défaut pour afficher du texte.
Ces valeurs pouvant être la couleur du texte, la couleur du fond du texte (qui n'a rien à voir avec la couleur de fond que vous avez pu définir pour votre fenêtre mais que l'on fait correspondre pour ne pas être embêté par un affichage bizarre...), la fonte utilisée, ...
Bien entendu, ces différentes valeurs pourront être modifiées. Mais avant de voir ces fonctions, voyons déjà à afficher du texte. Deux fonctions principales d'affichage de textes existent:
TextOut et DrawText:
1) La fonction TextOut
Cette fonction affiche du texte sur une seule ligne. Elle ne gère donc pas de retour chariot. Evidemment, si le texte sort de la zone de clipping, celui-ci sera tronqué !
BOOL TextOut(
HDC hdc, // handle d'un contexte de périphérique
int XStart, // coordonné du texte en x
int YStart, // coordonné de texte en y
LPCTSTR lpString, // pointeur sur la chaîne de caractères
int iLength // longueur de la chaîne
);
Pour le paramètre lpString, vous pouvez mettre la chaîne de caractères entre guillemets ou passer l'adresse d'une chaîne de caractères.
Pour la longueur de la chaîne, vous pouvez utiliser la fonction C: strlen ou bien mettre la taille en dur (pas beau...).
2) La fonction DrawText
Cette fonction permet de définir un rectangle dans lequel le texte doit
être écrit. Si une partie du texte dépasse la largeur, il
sera mis automatiquement mis à la ligne suivante.
La position passée pour dessiner le texte correspond par défaut
au coin supérieur gauche de la zone client.
Le texte sera donc dessiné vers la droite et vers le bas par rapport
aux coordonnées passées.
int DrawText(
HDC hDC, // handle d'un contexte de périphérique
LPCTSTR lpString, // Pointeur sur la chaîne de caractères
int nCount, // Longueur du texte
LPRECT lpRect, // C'est un pointeur sur une structure de type RECT
qui sera le rectangle dans lequel on veut afficher du texte
UINT uFormat // Options d'affichage du texte
);
Remarque : LPRECT est un paramètre en INPUT/OUTPUT. Les autres paramètres sont en INPUT
3) Ils existent d'autres fonctions comme celle-ci GrayString()
Dessine en standard une chaîne en grisé semblable au style utilisée par Windows pour indiquer un état désactivé
BOOL GrayString(
HDC hDC, // Descripteur d'un DC
HBRUSH hBrush, // Pinceau à utiliser pour griser, zéro pour utiliser
le pinceau courant
GRAYSTRINGPROC lpOutputFunc, // fonction callback Si NULL, utilise TextOut
LPARAM lpData, // Chaîne à griser, ou de la variable long qui sera
passée à la fonction de callback
int nCount, // Le nombre de caractères à afficher. Si nCount vaut
zéro et que lpData est une chaîne, GrayString calculera la longueur
de la chaîne
int X, // Coordonnées X, Y du rectangle de clipping de la chaîne
int Y,
int nWidth, // Largeur du rectangle de clipping de la chaîne en unités
de périphérique. Si zéro, la valeur est calculée
à partir de la chaîne
int nHeight
);
La fonction retourne une valeur non nul si pas d'erreur
Si vous n'utilisez pas TextOut, mais votre propre fonction, elle devra être de ce style:
BOOL CALLBACK OutputProc(
HDC hdc, // handle sur DC avec une zone de clipping correspondant au paramètre
passé dans GrayString
LPARAM lpData, // Chaîne
int cchData // Longueur de la chaîne
);
En sortie, la fonction retourne TRUE si tout est ok, sinon FALSE
(remarque, si on passe 1 dans le nombre de caractères sur GrayString et que notre fonction retourne FALSE, GrayString dessin dans la zone de clipping).
Les attributs d'un texte
1) La fonction SetTextAlign
UINT SetTextAlign(
HDC hdc, // handle du contexte de périphérique
UINT fMode // drapeau (constante) définissant l'alignement du texte
);
Les valeurs pour l'alignement sont :
Vous pouvez "cumuler" les valeurs possibles d'alignement grâce à |
Par exemple : TA_RIGHT | TA_BOTTOM indique que les coordonnées x et y correspondent au coin inférieur droit.
Valeur | Description |
TA_CENTER | centre le texte |
TA_LEFT | aligne le texte à gauche (valeur par défaut) |
TA_RIGHT | aligne le texte à droite |
TA_BASELINE | emplacement de la ligne de base de la police |
TA_BOTTOM | emplacement du bas du rectangle de clipping |
TA_TOP | emplacement en haut du rectangle (valeur par défaut) |
TA_NOUPDATECP | les fonctions de sortie de texte n'utilisent pas la position courante de dessin du contexte de périphérique |
TA_UPDATECP | les fonctions de sortie de texte utilisent pas la position courante de dessin du contexte de périphérique. La fonction de sortie met à jour la position après avoir dessiné. Les paramètres x et y des fonctions de sortie de texte sont ignorés : le tracé s'effectue à la position courante |
TA_RTLREADING | le texte s'affiche de droite à gauche (polices arabes et hébraïques) |
2) Les couleurs
SetTextColor change la couleur de votre texte.
COLORREF SetTextColor(
HDC hdc, // handle du contexte de périphérique
COLORREF Color // couleur de texte
);
cf. COLORREF et sa macro RGB
SetBkColor change la couleur de fond située derrière le texte.
COLORREF SetBkColor(
HDC hdc, // handle du contexte de périphérique
COLORREF crColor // couleur
de fond
);
idem, cf. COLORREF et sa macro RGB
3) Mode d'affichage
SetBkMode permet d'avoir une couleur de fond transparente grâce au drapeau
TRANSPARENT. Mais le drapeau OPAQUE est aussi disponible.
int SetBkMode(
HDC hdc, // handle du contexte de périphérique
int iBkMode // drapeau
);
iBkMode pouvant prendre deux valeurs:
- OPAQUE L'arrière plan sera rempli avec la couleur courante indiqué par SetBkColor.
- TRANSPARENT L'arrière plan ne sera pas modifié.
Voici un petit exemple reprenant la majorité des fonctions présentées:
Afficher un texte sous la forme utilisée par une barre de status
Il ne s'agit
pas de la fonction permettant l'utilisation du contrôle
barre de status qui sera vu dans un autre chapitre, mais plutôt de
simuler un comportement.
void DrawStatusText(
HDC hdc,
LPRECT lprc,
LPCTSTR pszText,
UINT uFlags
);
En entrée:
hdc qui est le handle sur un contexte de périphérique.
lprc qui pointe sur une structure de type RECT qui va contenir les coordonnées
d'un rectangle dans lequel sera affiché le texte avec le style d'une
barre de status.
pszText pointeur sur une chaîne de caractères terminée par
0 qui contiendra le texte à afficher. Il est possible d'aligner le texte
dans le rectangle. Par défaut, ce texte est aligné à gauche.
Pour le centrer, il suffit de mettre \t au début du texte. Pour l'aligner
à droite \t\t.
uFlags Style du rectangle:
Valeur | Styles |
0 | Le texte apparaît sur une surface qui semble enfoncée par rapport à la surface de la barre status (Valeur par défaut si vous ne précisez pas de style évidemment !) |
SBT_NOBORDERS | La texte apparaît sur une surface qui est à la même hauteur que la surface de la barre status. cela aura pour effet de ne plus afficher les bordures |
SBT_POPOUT | Le texte apparaît sur une surface qui semble plus haute par rapport à la surface de la barre status |
SBT_OWNERDRAW | Le texte sera affiché par la fenêtre parent |
SBT_RTLREADING | le texte sera affiché de droite à gauche. |
Annexes