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
);

Le système métrique étant par défaut à pixel, les coordonnées seront donc en pixel. L'origine étant par défaut au coin supérieur gauche de la zone client.

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:

 

Image non trouvée !


Afficher un texte sous la forme utilisée par une barre de status

Image non trouvée !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

Les fontes

La tailles des caractères