yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 2009
-
17 août 2006 à 14:28
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 2009
-
13 nov. 2006 à 11:50
Salut à tous,
je suis actuellement sous Dev-C++ 4.9.9.2 et je souhaiterais qu'un de mes programmes ait le style XP.
J'arrive à obtenir le style XP sans trop de souci sauf que (et oui ya un souci) certains de mes contrôles (static, radio, checkbox et edit)
ont quelques différences avec le style que l'on retrouve dans d'autres programmes sous windows XP.
Pour les statis, radios et checkboxes, c'est la couleur de fond qui cloche. En traitant le message WM_CTLCOLORSTATIC j'arrive à obtenir la bonne couleur de fond mais uniquement pur les statics, pas pour les radios et checkboxes.
En ce qui concerne les edits, lorsqu'elles ont le style ES_READONLY, il y a comme un contour noir qui apparait sur le contrôle.
Pas particulièrement esthétique donc.
Si vous avez une suggestion ou que vous avez rencontré le même problème, répondez moi.
Précision : mes contrôles se trouvent sur un tab control.
YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 18 août 2006 à 11:20
On dirait que j'ai trouvé quelque chose. Je me suis rappelé d'une
vieille feinte de Sioux quand je faisais du VB6, avec un problème
similaire.
L'astuce était de mettre ses composants dans un composant Image (de mémoire). Donc pour faire l'équivalent j'ai rajouté un static en fond et là...Ô miracle !!! Les statics, radios et checkboxes s'affichent normalement sans avoir besoin de traiter le message WM_CTLCOLORSTATIC.
Il restait juste le problème avec mes edits.
Pour y arriver, j'ai créé mes edits de sorte que leur parent soit le static en fond. Et là...Ô re-miracle !!!
Par contre avec cette méthode, pour pouvoir recevoir les messages envoyés par les edits, il faut penser à sous classer le static de fond.
Et voilou !!!
YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 13 nov. 2006 à 11:50
Salut vecchio56,
ça fait longtemps je sais mais je pense avoir résolu mon problème.
En fait voilà ce que j'ai fait pour mon static afin qu'il soit de la même couleur que mon TabControl :
case WM_CTLCOLORSTATIC: //Dessin des STATICs, RADIOs et CHECKBOXes
return (BOOL)CreateSolidBrush(GetSysColor(COLOR_MENU));
break;
Ils suffisait juste de savoir que le bonne couleur système était COLOR_MENU. (facile à dire )
YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 17 août 2006 à 22:34
Pour les radios et checkboxes tu peux essayer WM_CTLCOLORBTN, mais je crains que ca ne marche pas non plus
On pourrais avoir une petite capture (ou le code si tu veux bien) pour voir ce qui cloche?
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 18 août 2006 à 08:46
Merci de m'avoir répondu, c'est sympa de votre part.
Joky -> avec la source de vecchio56, ça me donne exactement la même chose qu'actuellement.
vecchio56 -> J'ai essayé avec WM_CTLCOLORBTN mais sans succès. Comme son nom l'indique ça ne fonctionne que pour les boutons.
Voilà des captures pour vous aider à mieux cibler :
YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 18 août 2006 à 10:15
Pour info les radios et les checkboxes sont des boutons avec des styles particuliers
J'ai fait un projet rapidement pour voir ce que ca donne, et je n'ai pas ce type de problème. Tu fais certainement quelque chose de spécial dans ton programme, non?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 18 août 2006 à 11:35
OK j'avais pas vu
Effectivement j'ai le même problème, mais le WM_CTLCOLORSTATIC résoud tous les problèmes il me semble.
Le seul truc c'est que je n'arrive pas à récupérer la couleur de fond de tabControl (GetClassLong(htab, GCL_HBRBACKGROUND) ne me renvoie pas un HBRUSH valide)
L'idée était de faire ca:
case WM_CTLCOLORSTATIC:
{
LOGBRUSH lb;
HBRUSH hbr = (HBRUSH)GetClassLong(htab, GCL_HBRBACKGROUND);
GetObject(hbr, sizeof lb, &lb);
SetBkColor((HDC)wParam, lb.lbColor);
return (LRESULT)hbr;
}
break;
Ca marche en codant en dur la couleur de fond:
#define TAB_BACKGROUND RGB(250, 251, 251)
HBRUSH hbrTab;
...
case WM_CTLCOLORSTATIC:
SetBkColor((HDC)wParam, TAB_BACKGROUND);
return (LRESULT)hbrTab;
et dans le WinMain:
hbrTab = CreateSolidBrush(TAB_BACKGROUND);
Le problème est que TAB_BACKGROUND peut certainement changer selon le style choisi. Il faudrait voir si la couleur apparait dans un index de GetSysColor
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 18 août 2006 à 11:51
En fait en intercalant un static (avec SS_BITMAP, ça marche peut-être aussi sans, pas essayé) entre le tab control et les composants à problème (static, radio, checkbox), l'affichage devient normal. Ya juste pour les edits où il faut une bidouille supplémentaire, les créer avec comme fenêtre parente, le static intercalé.
C'est plus clair dit comme ça ?
YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 18 août 2006 à 12:10
Ca me semble plus logique de tous les créer avec le static comme fenêtre parente, car sinon comment peux-tu être sur que le static restera bien derrière les autres contrôles?
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 18 août 2006 à 12:27
Excellente question !
En fait, mon static de fond est tjs visible (créé après le tab control, donc au-dessus, et avant les contrôles, donc au-dessous).
De plus, mes contrôles sont de temps en temps invisibles puis visibles, selon les clics sur les différents onglets du tab control.
Donc je suppose que cela assure que le static restera derrière les contrôles.
Tu es de mon avis ?
YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 18 août 2006 à 12:35
Oui sans doute.
Si tu ne veux pas avoir à créer de static inutiles, tu peux aussi utiliser la solution avec WM_CTLCOLORSTATIC qui j'ai écritte avant, elle marche très bien (mis à part le fait qu'on doit connaitre la couleur de fond du Tab Control)
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 18 août 2006 à 13:00
Ok, j'essaierai un peu plus tard ta solution.
Pour l'instant je me contente de ce que j'ai trouvé. ;-)
Je te tiens au courant dès que je l'aurai testée.
YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
MuPuF
Messages postés536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 août 2008 20 août 2006 à 21:05
j'ai une soluce pour vous, on peut rendre un static transparent, et ainsi ne plus avoir de couleur de fond, il suffit de mettre ça dans le code du WM_CTLCOLORSTATIC
Et l'affaire est réglé, j'en ais chié pour le trouver mais c'est que du bonheur maintenant, j'en avais besoin car des fois on a des images derriere les controles.
PS : Ca marche avec tout les controles, mais à eviter avec les edits non read-only car les selections ne s'effacent pas du fait que l'on "peint" avec un brush null, donc, il faut faire des invalidrect de tout les coté, et ça marche pas tjs, enfin un gros bordel pour pas grand chose au final.