Style d'un controle.

Résolu
Signaler
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Bonjour, la  je bloque sur un truc tout bete mais je voit pas du tout mon erreur. Je crée un dialogue tout bete avec 2 bouttons l'un avec le style BS_PUSHBUTTON et l'autre BS_DEFPUSHBUTTON donc normallement les deux devrait avoir BS_PUSHBUTTON.

je recupere le style avec LONG Styles = GetWindowLong(hwnd, GWL_STYLE);

Et jamais le test
if (Styles & BS_PUSHBUTTON) {
ne se valide.

J'ai meme testé
        Styles = Styles | BS_PUSHBUTTON;
        bool a = Styles & BS_PUSHBUTTON;
et a est toujours a false !

13 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
C'est tout à fait normal car BS_PUSHBUTTON vaut 0x00000000. Voici un extrait de winuser.h où les styles de boutons sont définis:

/*
 * Button Control Styles
 */
#define BS_PUSHBUTTON       0x00000000L
#define BS_DEFPUSHBUTTON    0x00000001L
#define BS_CHECKBOX         0x00000002L
#define BS_AUTOCHECKBOX     0x00000003L
#define BS_RADIOBUTTON      0x00000004L
#define BS_3STATE           0x00000005L
#define BS_AUTO3STATE       0x00000006L
#define BS_GROUPBOX         0x00000007L
#define BS_USERBUTTON       0x00000008L
#define BS_AUTORADIOBUTTON  0x00000009L
#define BS_PUSHBOX          0x0000000AL
#define BS_OWNERDRAW        0x0000000BL
#define BS_TYPEMASK         0x0000000FL
#define BS_LEFTTEXT         0x00000020L
#if(WINVER >= 0x0400)
#define BS_TEXT             0x00000000L
#define BS_ICON             0x00000040L
#define BS_BITMAP           0x00000080L
#define BS_LEFT             0x00000100L
#define BS_RIGHT            0x00000200L
#define BS_CENTER           0x00000300L
#define BS_TOP              0x00000400L
#define BS_BOTTOM           0x00000800L
#define BS_VCENTER          0x00000C00L
#define BS_PUSHLIKE         0x00001000L
#define BS_MULTILINE        0x00002000L
#define BS_NOTIFY           0x00004000L
#define BS_FLAT             0x00008000L
#define BS_RIGHTBUTTON      BS_LEFTTEXT
#endif /* WINVER >= 0x0400 */
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Je pense que Spy++ le fait aussi par déduction. Car, apparemment, il
n'y a pas d'autre moyen. Voici un petit exemple pour reconnaitre le
style BS_PUSHBUTTON:
LONG Styles = GetWindowLong(hwnd, GWL_STYLE);
if(!(Styles & 0x0000000F)) -> alors le style est BS_PUSHBUTTON.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,

C'est tout à fait normal.
BS_DEFPUSHBUTTON = 0x00000001
BS_AUTORADIOBUTTON = 0x00000009

Donc 0x00000001 & 0x00000009 = 0x00000001

Les 4 bits de poids faible du style représentent le type de bouton. Il ne sont donc pas combinables. Ce n'est pas correct d'avoir ces deux styles en même temps pour un bouton. Pour reconnaitre le type de bouton il suffit donc de lire la valeur représentée pas ces 4 bits de poids faible:
LONG Styles = GetWindowLong(hwnd, GWL_STYLE);
LONG TypeBouton = Styles & BS_TYPEMASK ;
switch (TypeBouton)
{
    case 0:
        MessageBox(0,"BS_PUSHBUTTON","Type",0);
        break;
    case 1:
        MessageBox(0,"BS_DEFPUSHBUTTON","Type",0);
        break;
    case 2:
        MessageBox(0,"BS_CHECKBOX","Type",0);
        break;
    case 3:
        MessageBox(0,"BS_AUTOCHECKBOX","Type",0);
        break;
    case 4:
        MessageBox(0,"BS_RADIOBUTTON","Type",0);
        break;
    case 5:
        MessageBox(0,"BS_3STATE","Type",0);
        break;
    case 6:
        MessageBox(0,"BS_AUTO3STATE","Type",0);
        break;
    case 7:
        MessageBox(0,"BS_GROUPBOX","Type",0);
        break;
    case 8:
        MessageBox(0,"BS_USERBUTTON","Type",0);
        break;
    case 9:
        MessageBox(0,"BS_AUTORADIOBUTTON","Type",0);
        break;
    case 10:
        MessageBox(0,"BS_PUSHBOX","Type",0);
        break;
    case 11:
        MessageBox(0,"BS_OWNERDRAW","Type",0);
        break;
}
//.....
Ce petit exemple récupère le style du bouton et affiche son  type dans un MessageBox.
BS_TYPEMASK n'est pas un style applicable à un bouton. C'est un masque permettant de retrouver le type de bouton. Il vaut 0x0000000F.
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
Tu est sur que le hwnd est un handle sur le bon controle (le bouton avec BS_PUSHBUTTON) ?

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Oui sur et certain mais

Styles = Styles | BS_PUSHBUTTON;
 bool a = Styles & BS_PUSHBUTTON;

a doit pas etre obligatoirement a true ?
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Et du coup ya un moyen de savoir si le style BS_PUSHBUTTON est dans un style de boutton ou pas ?.
En fait dans un checkbox il n'y est pas mais il y est dans un boutton tout simple. Je peux faire par elimination (si il n'a pas le style BS_CHECBOX) mais je suis toujours intrigué j'utlise un clone de spy++ et lui arrive a faire la difference.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Selon MSDN, le style BS_PUSHBUTTON permet à la procédure de la fenêtre contenant le bouton de recevoir le message WM_COMMAND quand ce bouton est actionné. Ce style ne sert qu'à la lisibilité du code car de toute façon, tous les boutons envoient ce message à la fenêtre mère. Puisque la valeur de ce style est 0, on ne peut donc ni le récupérer, ni le supprimer, ni l'ajouter.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Snoops >> Qu'est ce que tu cherches à faire exactement?
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Ce style est retrouvable par simple déduction. Si le bouton n'a pas les autres styles, alors il  a le style BS_PUSHBUTTON.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Ben en fait je "customise" des dialogs et selon le controle (radio/boutton/groupbox) je ne redessine pas la meme chose. Je vais bosser par deduction avec des elseifs en commancant par le bas et si il n'a aucun des styles speciaux je ferait un boutton banal.

Mais je ne voit pas comment spy++ arrive a voir les controles qui l'ont ou pas.
Messages postés
755
Date d'inscription
samedi 15 mai 2004
Statut
Membre
Dernière intervention
30 janvier 2011

il sont tous sur la MSDN
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Rien a faire nouveau probleme.

long a = BS_DEFPUSHBUTTON;
bool y = a & BS_AUTORADIOBUTTON;

y est a true, pas moyen de faire mes tests.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

:)
Exellent, je pouvais pas trouver mieux et avec ca je peux meme recuperer BS_PUSHBUTTON.

Merci