Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006
-
16 janv. 2006 à 01:05
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006
-
16 janv. 2006 à 18:23
Bonsoir à tous,
Je cherche déseprérément à changer les couleurs des items d'une listbox (blanc sur fond rouge par exemple). J'ai trouvé pêle-mêle des API à utiliser, à savoir WM_DRAWITEM voir WM_MEASUREITEM, des structures DRAWITEMSTRUCT et autres. Par contre je ne trouve pas d'exemples --> simples <-- qui m'expliquent clairement comment tout cela doit être imbriqué.
Pour info complémentaire, je dirais que chaque item de la zone de liste peut avoir une valeur (passée par LB_SETITEMDATA) comprise entre 0 et 3 en sachant que 0 et 1 donne un fond rouge et 2 et 3 donne un fond noir. (histoire de cadrer la demande)
Voilà, si vous savez des choses là-dessus, merci de bien vouloir m'aider.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 16 janv. 2006 à 17:00
Salut,
Pour une listbox ownerdraw la valeur associée se passe lors du LB_INSERTSTRING.
WM_MEASUREITEM: Tu n'est pas obligé de traiter ce message, sauf si tu
veux modifier la taille d'un item. Pour modifier la hauteur de tout les
items tu peux toujours utiliser LB_SETITEMHEIGHT.
WM_DRAWITEM:
La structure DRAWITEMSTRUCT te donne tout ce dont tu as besoin, le dc le rectangle, le status, le focus..
Exemple:
J'ai defini une structure qui contient les infos de l'item (texte, couleur, brush).
Pour chaque item on alloue et on remplie une structure LBITEM.
On ajoute un item en passant un pointeur sur cette structure dans le LB_INSERTSTRING.
Lors du WM_DRAWITEM, on recupere ce pointeur dans le champ itemData de la structure DRAWITEMSTRUCT, et on dessine..
Structure:
typedef struct _LBITEM
{
LPTSTR text; // texte de l'item
COLORREF textcolor; // couleur du texte
HBRUSH bgbrush; // brush pour dessiner le fond de l'item
} LBITEM, *PLBITEM;
Traitement du WM_DRAWITEM:
LPDRAWITEMSTRUCT info = (LPDRAWITEMSTRUCT) lParam;
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 16 janv. 2006 à 18:11
Salut,
Ben pour colorier le fond c'est le FillRect() qui fait ca.
Si tu dessines du texte par dessus faut penser a faire le SetBkMode(info->hDC, TRANSPARENT);
Et pour l'emplacement du texte, il faut regarder dans msdn tout les
flags dispo pour le dernier param de DrawText(), dans l'exemple j'ai
mis DT_VCENTER | DT_CENTER donc le texte devrait s'afficher en plein
milieux du rectangle de l'item.
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 16 janv. 2006 à 18:23
Oui oui je me suis renseigné dans le SDK. Pour mon projet, je les ai donc mis en DT_LEFT, sauf qu'ils sont beaucoup trop à gauche en fait. En mode normal, y'a comme une marge de 1 ou 2 pixel entre le bord et le caractère alors qu'en ownerdraw le texte est complètement collé contre le bord.
J'ai testé un truc avant de poster ce message et j'ai trouvé comment faire :
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 16 janv. 2006 à 17:54
Merci beaucoup aardman, j'ai réussi à me baser sur ton code pour récupérer le contenu des items de la zone de liste. Pour mon projet, j'ai une liste chaînée de structures qui contiennent le texte à afficher, donc j'ai réutilisé ça.
Maintenant, le texte s'affiche complètement à gauche de la liste et la 1ère lettre de chaque ligne est légèrement rognée.
J'ai le texte, c'est déjà une bonne chose, je dois maintenant essayé de colorier le fond des items :)