Radiobutton

6 réponses
Avatar
Roger
Je crée des boutons radio sans passer par un .rc, ni une dialogbox,
directement par CreateWindow("BUTTON", "Croissant", WS_CHILD | WS_VISIBLE |
BS_AUTORADIOBUTTON | BS_OWNERDRAW, etc...).
Derrière un groupe: CreateWindow("BUTTON", "Type de tri", WS_CHILD |
WS_VISIBLE | BS_GROUPBOX | WS_GROUP, etc...)

Comme je veux présenter mes boutons d'une certaine manière j'utilise
BS_OWNERDRAW de manière à récupérer la main au moment de leur création par
le message: WM_DRAWITEM.

Sous le case WM_DRAWITEM, j'arrive à présenter mes radio boutons exactement
comme je le souhaite en utilisant in fine: TextOut pour le texte du radio
bouton et DrawFrameControl pour le radio bouton lui-même.

Par contre après ce traitement mes radio boutons sont bloqués, impossible
d'en sélectionner un ni par la souris en cliquant dessus, ni par la
fonction: CheckDlgButton dans le WM_CREATE !!

Si j'enlève le flag BS_OWNERDRAW du CreateWindow je ne maîtrise plus la
présentation des radio boutons, mais je n'ai plus ce problème, je les
sélectionne tout à fait normalement.
Quand je dis que je ne maîtrise plus ça n'est pas tout à fait exact car je
peux encore jouer sur la police de caractères, la couleur du texte et du
fond car j'ai remarqué que les radio boutons ainsi que le groupe se
comportent sur ce plan en partie comme des contrôles statiques (sans le
BS_OWNERDRAW, ils prennent le message WM_SETFONT et ils envoient le message
WM_CTLCOLORSTATIC)

Mais ma question porte sur le blocage lors de l'utilisation de BS_OWNERDRAW
? Auriez-vous une idée de ce qu'il faudrait que je rajoute pour débloquer
les boutons radio ?
Merci

6 réponses

Avatar
Christian ASTOR
Roger a écrit :
Je crée des boutons radio sans passer par un .rc, ni une dialogbox,
directement par CreateWindow("BUTTON", "Croissant", WS_CHILD | WS_VISIBLE |
BS_AUTORADIOBUTTON | BS_OWNERDRAW, etc...).



Comme indiqué dans la doc :
"
Do not combine the BS_OWNERDRAW style with any other button styles.
"

Avec BS_OWNERDRAW, on dessine donc tous les états
Avatar
Roger

Comme indiqué dans la doc :
"
Do not combine the BS_OWNERDRAW style with any other button styles.
"

Avec BS_OWNERDRAW, on dessine donc tous les états



Tu veux dire qu'il faut que je dessine par DrawFrameControl, le petit cercle
du bouton radio non checked (c'est ce que je faisais jusqu'à présent par les
paramètres: DFC_BUTTON, DFCS_BUTTONRADIO), mais qu'il faut que je dessine
aussi maintenant le petit cercle dans l'état checked (ce que je ne faisais
pas jusqu'à présent, mais qui est possible avec les paramètres: DFC_BUTTON,
DFCS_BUTTONRADIO | DFCS_CHECKED).
Toutefois, si je me contente de faire celà, je ne peux pas faire seulement
les deux à la suite sinon c'est seulement le dernier qui reste apparent sur
l'écran, je ne vois alors qu'une solution qui résout le problème quand on
veut checker par programme avec la fonction CheckDlgButton c'est d'utiliser
un flag (vrai ou faux) selon qu'on veut checker ou déchecker, flag que l'on
va ensuite tester dans WM_DRAWITEM pour choisir la fonction DrawFrameControl
qui dessinera le petit cercle souhaité (checked ou non).
Cependant, si cette solution résout le problème du check par programme, je
ne vois pas comment le résoudre lorsque c'est l'utilisateur qui clique sur
le contrôle.
Sauf évidemment, mais là on prend un éléphant pour écraser une souris, à
tester si la souris se trouve dans le périmètre du contrôle chaque fois que
l'utilisateur clique. Est-ce à cette dernière solution à laquelle tu pensais
?
Merci
Avatar
Christian ASTOR
Roger a écrit :

Sauf évidemment, mais là on prend un éléphant pour écraser une souris, à
tester si la souris se trouve dans le périmètre du contrôle chaque fois que
l'utilisateur clique. Est-ce à cette dernière solution à laquelle tu pensais
?



Non, pas besoin, il faut tester les différents états, comme ODS_SELECTED
notamment.
Mais tout dépend le besoin, car ça permet de personnaliser entièrement
le contrôle (en blittant des bitmaps par exemple), mais ça fait pas mal
de code en plus (si c'est juste pour changer la fonte, pas la peine...)
Avatar
Roger

Non, pas besoin, il faut tester les différents états, comme ODS_SELECTED
notamment.
Mais tout dépend le besoin, car ça permet de personnaliser entièrement le
contrôle (en blittant des bitmaps par exemple), mais ça fait pas mal de
code en plus (si c'est juste pour changer la fonte, pas la peine...)




Merci,
Oui pour la fonte, comme je l'ai dit dans mon 1er message j'ai remarqué que
les radio boutons acceptaient les messages WM_SETFONT ce qui permet de la
changer. J'ai aussi remarqué qu'ils se comportaient comme des contrôles
statiques ce qui fait que windows envoie le message WM_CTLCOLORSTATIC au
moment de leur création ce qui permet en outre de changer la couleur du
texte et du fond. Il en est de même d'ailleurs pour le CreateFile du groupe
(BS_GROUPBOX), à propos de ce dernier j'avais aussi essayé de le redessiner
en lui rajoutant un BS_OWNERDRAW, mais je n'ai jamais pu trouver ce qu'il
fallait faire sous le WM_DRAWITEM pour le redessiner, dès que je rajoute un
BS_OWNERDRAW sur sa ligne c'est un rectangle blanc qui s'affiche à sa place
sur l'écran et tous les textout que j'ai pu essayer sous le WM_DRAWITEM sont
inefficaces (aucun texte ne s'affiche).
Merci
Avatar
Christian ASTOR
Roger a écrit :
j'avais aussi essayé de le redessiner en lui rajoutant un BS_OWNERDRAW





Comme je disais,
"
Do not combine the BS_OWNERDRAW style with any other button styles.
"

BS_OWNERDRAW s'utilise donc seul et permet de tout redessiner...
Un Group Box est dessiné par DrawEdge()
(ou DrawThemeBackground() si theme)
Avatar
Roger
"Christian ASTOR" a écrit dans le message de
news: j02sjd$r5a$
Roger a écrit :
BS_OWNERDRAW s'utilise donc seul et permet de tout redessiner...
Un Group Box est dessiné par DrawEdge()
(ou DrawThemeBackground() si theme)




Merci