Style Xp

Résolu
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
-
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
-
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

Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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 !"
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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 !"
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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 !"
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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 !"
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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 !"
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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 !"
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
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
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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 !"
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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 !"
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

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.