2008-09-14 5 views
8

Je dessinais vieille école (unthemed - radios thématiques sont un tout autre problème) boutons radio moi-même en utilisant DrawFrameControl:Comment déterminer la taille de la partie de touche d'un bouton radio de Windows

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

J'ai jamais été en mesure de trouver un moyen sûr de comprendre ce qu'il faut passer pour le RECT. J'ai utilisé un rectangle de 12x12 mais j'aime Windows pour me dire la taille d'un bouton radio. DrawFrameControl semble mettre à l'échelle le bouton radio pour s'adapter au rect je passe donc je dois être proche de la "bonne" taille de la radio regarde d'autres radios (non-propriétaire dessiné) sur l'écran.

Quelqu'un sait-il comment faire?

Répondre

2

Cela fait un moment que j'ai travaillé dessus, donc 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 mappes de bits 13 x 13 plutôt que 12 x 12. La partie bitmap de la case à cocher semble être transmise dans le WM_DRAWITEM. Cependant, j'avais aussi mis en place WM_MEASUREITEM et je lui ai donné les mêmes valeurs, alors ma réponse pourrait bien être "Mendier la question" dans le bon sens philosophique.

 
     case WM_MEASUREITEM: 
      lpmis = (LPMEASUREITEMSTRUCT) lParam; 

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

      break; 


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



      if (lpdis->itemState & ODS_CHECKED) // if selected 
       { 
       SelectObject(hdcMem, hbmChecked); 
       } 
      else 
       { 
       if (lpdis->itemState & ODS_GRAYED) 
        { 
        SelectObject(hdcMem, hbmDefault); 
        } 
       else 
        { 
        SelectObject(hdcMem, hbmUnChecked); 
        } 
       } 
      StretchBlt(
       lpdis->hDC,   // destination DC 
       lpdis->rcItem.left, // x upper left 
       lpdis->rcItem.top, // y upper left 

       // The next two lines specify the width and 
       // height. 
       lpdis->rcItem.right - lpdis->rcItem.left, 
       lpdis->rcItem.bottom - lpdis->rcItem.top, 
       hdcMem, // source device context 
       0, 0,  // x and y upper left 
       13,  // source bitmap width 
       13,  // source bitmap height 
       SRCCOPY); // raster operation 

      DeleteDC(hdcMem); 
      return TRUE; 

Cela semble bien fonctionner pour Win2000 et XP, même si je ne sais pas ce que Vista pourrait faire.

Cela peut valoir la peine de faire une expérience pour voir ce que fait WM_MEASUREITEM, bien que je découvre habituellement avec l'ancien code que j'avais habituellement une bonne raison de faire quelque chose qui semble redondant.

4

Cette page présente quelques directives de dimensionnement pour les contrôles. Notez que les tailles sont données dans les deux DLU (unités de dialogue) et pixels, selon que vous placez le contrôle sur une boîte de dialogue ou non:

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

Je pensais que l'API GetSystemMetrics pourrait retourner la taille standard pour certains des contrôles communs, mais je n'ai rien trouvé. Il pourrait y avoir une API spécifique au contrôle commun pour déterminer le dimensionnement.

Questions connexes