Style d'un controle.

Résolu
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 27 août 2006 à 18:03
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 29 août 2006 à 06:51
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

racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
27 août 2006 à 18:20
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 */
3
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
27 août 2006 à 20:42
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.
3
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
29 août 2006 à 05:57
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.
3
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
27 août 2006 à 18:15
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.
0

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

Posez votre question
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
27 août 2006 à 18:20
Oui sur et certain mais

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

a doit pas etre obligatoirement a true ?
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
27 août 2006 à 19:14
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.
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
27 août 2006 à 19:46
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.
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
27 août 2006 à 19:51
Snoops >> Qu'est ce que tu cherches à faire exactement?
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
27 août 2006 à 20:01
Ce style est retrouvable par simple déduction. Si le bouton n'a pas les autres styles, alors il  a le style BS_PUSHBUTTON.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
27 août 2006 à 20:06
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.
0
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
27 août 2006 à 22:56
il sont tous sur la MSDN
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
28 août 2006 à 18:37
Rien a faire nouveau probleme.

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

y est a true, pas moyen de faire mes tests.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
29 août 2006 à 06:51
:)
Exellent, je pouvais pas trouver mieux et avec ca je peux meme recuperer BS_PUSHBUTTON.

Merci
0
Rejoignez-nous