Salut !
D'abord vérifier si TCanvas dispose d'une méthode DrawText qui s'appuierait sur le même principe que celle des API WINDOWS !
Cette fonction aligne le texte dans un RECT (TRect chez toi) aussi bien en horizontal qu'en vertical.
Si ça n'existe pas, dans ce cas il est nécessaire d'utiliser OnDrawItem donc en fixant :
ListBox1->Style = bOwnerDrawFixed;
Après, il faut coder dans la :
1 2 3 4
| void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
} |
L'idée est alors de développer un code où l'on va reculer d'une strate : on passe de BCB aux API WINDOWS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
// Un TRect WINDOWS qu'il faudra initialiser avec le &Rect (à moins que ce soit compatible...)
RECT rc;
// On récupère le HWND de la ListBox
HWND hwnd = Control->Handle;
// on récupère de HDC de HWND
HDC hdc = GetDC( hwnd );
// donc on initialise ce qui doit l'être :
rc.left =
rc.top =
rc.right =
rc.bottom =
// Effacer / coloriser le fond en fonction de la valeur de State
FillRect(hdc, &rc, couleur_de_fond); // couleur_de_fond est un RGB ou un COLORREF
// On va écrire en mode transparent pour ne pas altérer la couleur de fond :
SetBkMode(hdc, TRANSPARENT);
// En fonction de la couleur du fond... donc en partie en fonction de State ...on fixe la couleur du texte
SetTextColor(hdc, couleur_du_texte); // couleur_du_texte est un RGB ou un COLORREF
// On affecte ensuite au hdc la fonte du ListBox en récupérant son HFONT
SelectObject(hdc, Canvas->Font->Handle);
//...
//... normalement yapluka :
// L'API WINDOWS où Text est la chaîne à afficher çàd un pointeur vers tableau de char
DrawText(hdc, Text, -1, &rc, DT_SINGLELINE | DT_RIGHT | DT_VCENTER);
// On en a terminé donc on rend le hdc
ReleaseDC( hdc ); |
la valeur DT_RIGHT (aligner à droite) peut aussi être DT_LEFT (aligner à gauche) ou DT_CENTER (centrer entre rc.left et rc.right)
la valeur DT_VCENTER centre verticalement entre rc.top et rc.bottom.
Il faudrait tester (je vais essayer de mon coté)!
Tout dépend de ce que l'on peut faire dans la hiérarchie des procédures graphiques BCB/WINDOWS
A ce stade, est-ce que BCB va réussir à compiler à la bonne place et donc, au bon moment (en termes d'exécution) le OnDrawItem ?
A plus !
Partager