Comment déterminer la taille de la partie bouton d’un bouton radio Windows

Je dessine les boutons radio old school (non thématisés – thématiques sont un autre problème) moi-même en utilisant DrawFrameControl:

DrawFrameControl(dc, &rectRadio, DFC_BUTTON, isChecked() ? DFCS_BUTTONRADIO | DFCS_CHECKED : DFCS_BUTTONRADIO); 

Je n’ai jamais été capable de trouver un moyen sûr de savoir quoi faire pour le RECT. J’ai utilisé un rectangle 12×12 mais je suis comme Windows pour me dire la taille d’un bouton radio.

DrawFrameControl semble adapter le bouton radio pour adapter le recto que je passe afin que je sois proche de la “bonne” taille de la radio qui regarde les autres radios (non-propriétaires) à l’écran.

Quelqu’un sait-il comment faire ça?

Cette page affiche des directives de dimensionnement pour les contrôles. Notez que les tailles sont données à la fois dans les unités de dialog (DLU) et les pixels, selon que vous placez le contrôle dans une boîte de dialog ou non:

http://msdn.microsoft.com/en-us/library/aa511279.aspx#controlsizing

Je pensais que l’API GetSystemMesortingcs pourrait renvoyer la taille standard pour certains des contrôles courants, mais je n’ai rien trouvé. Il pourrait y avoir une API spécifique aux contrôles pour déterminer le dimensionnement.

Cela faisait longtemps que je n’avais pas travaillé là-dessus, alors ce que je décris est ce que j’ai fait, et pas nécessairement une réponse directe à la question.

Il m’arrive d’utiliser des mappages de bits 13 x 13 plutôt que 12 x 12. La partie bitmap de la case à cocher semble être passée dans le WM_DRAWITEM. Cependant, j’avais également configuré WM_MEASUREITEM et alimenté les mêmes valeurs, donc ma réponse pourrait bien être “Demander la question” au sens philosophique correct.

         case WM_MEASUREITEM:
             lpmis = (LPMEASUREITEMSTRUCT) lParam;

             lpmis-> itemHeight = 13;
             lpmis-> itemWidth = 13;

             Pause;


         case WM_DRAWITEM:
             lpdis = (LPDRAWITEMSTRUCT) lParam;
             hdcMem = CreateCompatibleDC (lpdis-> hDC);  



             if (lpdis-> itemState & ODS_CHECKED) // si sélectionné
                 {
                 SelectObject (hdcMem, hbmChecked);
                 }
             autre
                 {
                 if (lpdis-> itemState & ODS_GRAYED)
                     {
                     SelectObject (hdcMem, hbmDefault);
                     }
                 autre
                     {
                     SelectObject (hdcMem, hbmUnChecked);
                     }
                 }
             StretchBlt (
                 lpdis-> hDC, // destination DC
                 lpdis-> rcItem.left, // x en haut à gauche
                 lpdis-> rcItem.top, // y en haut à gauche

                 // Les deux lignes suivantes spécifient la largeur et
                 // la taille.
                 lpdis-> rcItem.right - lpdis-> rcItem.left,
                 lpdis-> rcItem.bottom - lpdis-> rcItem.top,
                 hdcMem, // contexte de périphérique source
                 0, 0, // x et y en haut à gauche
                 13, // source bitmap largeur
                 13, // source bitmap hauteur
                 SRCCOPY);  // opération raster

             DeleteDC (hdcMem);
             retourner TRUE;

Cela semble bien fonctionner pour Win2000 et XP, bien que je sois nbo idée de ce que Vista pourrait faire.

Cela pourrait valoir la peine de faire une expérience pour voir ce que laisse de côté WM_MEASUREITEM, bien que je découvre généralement avec l’ancien code que j’avais généralement de bonnes raisons de faire quelque chose qui semblait redondant.