COMBOBOX EN COULEURS, LECTURE SEULE...(API)

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 16 août 2005 à 16:08
frogs_yoman Messages postés 11 Date d'inscription mercredi 22 décembre 2010 Statut Membre Dernière intervention 25 août 2006 - 28 mai 2006 à 18:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33268-combobox-en-couleurs-lecture-seule-api

frogs_yoman Messages postés 11 Date d'inscription mercredi 22 décembre 2010 Statut Membre Dernière intervention 25 août 2006
28 mai 2006 à 18:21
Ok, c'est pour ça que j'avais des affichages un peu zarb :)
mais je trouve ça un peu tordu lol.

Cool merci pour ton aide !
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
28 mai 2006 à 17:37
Selon MSDN, notre procédure doit retourner un HBRUSH. Le système utilse ce HBRUSH pour dessiner le fond de l'Edit.
frogs_yoman Messages postés 11 Date d'inscription mercredi 22 décembre 2010 Statut Membre Dernière intervention 25 août 2006
28 mai 2006 à 15:01
ok merci,
par contre si on retourne: return 0 /*ou autre...*/; au lieu de (LRESULT)HBRUSH, ça ne marche plus (la couleur n'est pas appliquée), je pensais qu'avec SetTextColor(..) ça suffisait...?
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
28 mai 2006 à 14:49
Salut,
Pour le compilateur, la procédure de la fenêtre WndProc ne peut pas retourner un HBRUSH. Elle doit retourner un LRESULT. Pour retourner un HBRUSH il faut d'abord le caster en LRESULT ou BOOL. Ces deux derniers sont compatibles. LRESULT est un long et BOOL est un int. long et int sont pareils pour les compilateurs sous Windows en 32 bits. J'ai utilisé BOOL car j'ai l'habitude de l'employer dans les procédures de boites de dialogues qui retournent un BOOL. C'est une bonne remarque.
Il n'est pas possible d'utiliser SendMessage(). Le message WM_CTLCOLOREDIT informe notre procédure qu'un Edit est en train d'être dessiné. Cela nous permet de choisir les couleurs de notre Edit. Il n'y a pas de meilleure solution.
frogs_yoman Messages postés 11 Date d'inscription mercredi 22 décembre 2010 Statut Membre Dernière intervention 25 août 2006
28 mai 2006 à 13:44
Salut, tt d'abord merci pour la source pleine d'astuces sympas.

Je ne comprends pas pq il faut faire un return (BOOL)HBRUSH... pour la modif des couleurs lors du catch de WM_CTLCOLOREDIT ou equivalent.

Est-ce qu'il n'y a pas un moyen de faire la meme chose avec un SenMessage((HWND)Combo,...) ?

Merci pour ton aide
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
7 sept. 2005 à 21:12
J'ai oublié de préciser que dans ton exemple, on crée un GroupBox et non un Edit.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
7 sept. 2005 à 21:07
Salut,
FAVES >> EditProc est la procedure de sous-classement de l'Edit contenu dans le ComboBox. Je n'ai donc pas créé cet Edit j'ai juste récupéré son HWND puis changé l'adresse de sa procédure pour agir sur les messages qui lui sont déstinés. Certes on peut changer son style en ES_READONLY avec SetWindowLong. C'est déja essayé et ca amène quelques défauts qui nécessitent des lignes de codes supplémentaires pour les enlever. C'est pour cela que j'ai préféré l'autre solution qui consiste à intercepter les messages voulus dans la proc de sous-classement.
cs_faves Messages postés 39 Date d'inscription mardi 20 janvier 2004 Statut Membre Dernière intervention 27 novembre 2009
3 sept. 2005 à 21:32
Salut,
J'ai vu que tu as fait une 'Editbox' en lecture seule avec la fonction LRESULT CALLBACK EditProc.
Seulement tu pourvais tout simplement mettre ES_READONLY dans la fonction de création de l'edit :
hCadre1=CreateWindow("BUTTON"," EditBox ",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | ES_READONLY | BS_CENTER,10,130,300,290,hWnd,0,0,0);

Voila, c'était pour info
@++
Faves
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
16 août 2005 à 17:35
ok merci ;)
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 août 2005 à 17:01
cosmobob >> Dès que j'aurai du temps je me pencherai dessus. Si j'y arrive, je te le signalerai.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 août 2005 à 16:58
Toujours à propos de police voici la boucle que j'ai ajoutée à ce code source:

HGDIOBJ font=GetStockObject (DEFAULT_GUI_FONT);
HWND child=GetWindow(hWnd,GW_CHILD);
do
{
SendMessage(child,WM_SETFONT,(WPARAM)font,0);
child=GetWindow(child,GW_HWNDNEXT);
}while (child);

C'est une trouvaille que j'ai faite il y'a quelque temps. Elle permet de changer la police de tous les controles enfants. Avant, j'étais oubligé de mettre les HWNDs dans des tableaux afin de pouvoir changer leur police dans une boucle for. Ca fonctionnait bien mais la lisibilité du code était très réduite. Avec cette nouvelle méthode, ce problème est résolu.
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
16 août 2005 à 16:50
salut, je sais que c'est un peu hors sujet mais j'ai une question:
dans une listview, est ce que tu sais comment changer la couleur d'une ligne donnée ? lvm_settextcolor change la couleur de toutes les lignes.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 août 2005 à 16:16
Dans cette mise à jour, j'ai amélioré l'interface, suite à la remarque de vecchio56, en remplaçant la police de tous les controles.
Un autre membre à demandé comment faire pour changer la police d'un controle. On utilise le message WM_SETFONT comme ceci:
SendMessage(hwndControl,WM_SETFONT,(WPARAM)hFont,0);
hFont est le handle de la police déjà créée ou récupérée dans le stock de Windows.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 août 2005 à 16:08
Salut,
En voulant mettre à jour mon code source, j'ai eu la malchance de l'effectuer pendant l'actualisation de la base de données du serveur. Il s'agit ici donc du même code déposé en nouvelle source. L'ancien lien est perdu avec tous les commentaires.