2008-09-14 6 views
8

Ich zeichne alte Schule (unthemed - Themen-Radios sind ein ganz anderes Problem) Radiobuttons selbst mit DrawFrameControl:Wie die Größe des Knopfabschnittes eines Windows-Optionsfeld, um bestimmen

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

Ich habe war nie in der Lage, einen sicheren Feuerweg zu finden, um herauszufinden, was für das RECT passieren soll. Ich habe ein 12x12 Rechteck verwendet, aber ich bin wie Windows, um mir die Größe eines Optionsfelds zu sagen.

DrawFrameControl scheint den Radioknopf so zu skalieren, dass er in das Rechteck passt, also muss ich nah an der "richtigen" Größe des Radios sein, von anderen (nicht gezeichneten) Radios auf dem Bildschirm.

Wer weiß, wie man das macht?

Antwort

2

Es ist schon eine Weile her, dass ich daran gearbeitet habe, also beschreibe ich, was ich getan habe, und nicht unbedingt eine direkte Antwort auf die Frage.

Ich verwende Bitmaps 13 x 13 statt 12 x 12. Der Bitmap-Teil des Kontrollkästchens scheint im WM_DRAWITEM übergeben zu werden. Allerdings hatte ich auch WM_MEASUREITEM eingerichtet und verfügte über die gleichen Werte, so dass meine Antwort "im richtigen philosophischen Sinne" sein könnte.

 
     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; 

Dies scheint gut für beide Win2000 und XP zu arbeiten, obwohl ich nbo Ahnung habe, was Vista tun könnte.

Es könnte ein Experiment wert sein, um zu sehen, was WM_MEASUREITEM auslässt, obwohl ich normalerweise mit altem Code entdecke, dass ich normalerweise einen guten Grund habe, etwas zu tun, das überflüssig aussieht.

4

Auf dieser Seite werden einige Größenrichtlinien für Steuerelemente angezeigt. Beachten Sie, dass die Größen sowohl in der DLU angegeben (Dialogeinheiten) und Pixel, je nachdem, ob Sie das Steuerelement platzieren auf einem Dialog oder nicht:

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

Ich dachte, die GetSystemMetrics API könnte die Standardgröße zurückzukehren für einige der allgemeinen Kontrollen, aber ich habe nichts gefunden. Möglicherweise gibt es eine gemeinsame kontrollspezifische API, um die Größenbestimmung zu bestimmen.

Verwandte Themen