Style Xp

Résolu
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 - 17 août 2006 à 14:28
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 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 !"

16 réponses

yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 3
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 !"
3
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 3
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 !"
3
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
17 août 2006 à 18:30
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
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?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 3
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 !"
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 3
18 août 2006 à 08:53
Désolé pour les images, j'avais mis un lien local, forcément...

   


YOYO, @+.








"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
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?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 3
18 août 2006 à 10:51
Comme je l'ai dit au début, la particularité est que ces composants sont sur un Tab Control.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
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

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
18 août 2006 à 11:37
Bon d'accord j'ai un petit peu de retard :)
J'ai pas compris comment tu as fait par contre

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 3
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 !"
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
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?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 3
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 !"
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
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)

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 3
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 !"
0
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 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

SetBkMode((HDC) wParam, TRANSPARENT);
return (LRESULT)GetStockObject(NULL_BRUSH);

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.
0
Rejoignez-nous