racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 2014
-
16 août 2005 à 16:08
frogs_yoman
Messages postés11Date d'inscriptionmercredi 22 décembre 2010StatutMembreDernière intervention25 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.
frogs_yoman
Messages postés11Date d'inscriptionmercredi 22 décembre 2010StatutMembreDernière intervention25 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és1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és11Date d'inscriptionmercredi 22 décembre 2010StatutMembreDernière intervention25 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és1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és11Date d'inscriptionmercredi 22 décembre 2010StatutMembreDernière intervention25 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és1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és39Date d'inscriptionmardi 20 janvier 2004StatutMembreDernière intervention27 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és700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 16 août 2005 à 17:35
ok merci ;)
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 16 août 2005 à 16:58
Toujours à propos de police voici la boucle que j'ai ajoutée à ce code source:
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és700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 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és1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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.
28 mai 2006 à 18:21
mais je trouve ça un peu tordu lol.
Cool merci pour ton aide !
28 mai 2006 à 17:37
28 mai 2006 à 15:01
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...?
28 mai 2006 à 14:49
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.
28 mai 2006 à 13:44
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
7 sept. 2005 à 21:12
7 sept. 2005 à 21:07
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.
3 sept. 2005 à 21:32
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
16 août 2005 à 17:35
16 août 2005 à 17:01
16 août 2005 à 16:58
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.
16 août 2005 à 16:50
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.
16 août 2005 à 16:16
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.
16 août 2005 à 16:08
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.