2008-09-14 1 views
8

Я рисую старую школу (unthemed - тематические радиостанции совершенно другая проблема) радиокнопки себя с помощью DrawFrameControl:Как определить размер кнопки части радио-кнопки Windows,

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

Я никогда не смог найти верный способ, чтобы понять, что нужно пройти для RECT. Я использовал прямоугольник 12x12, но я, как Windows, сказал мне размер переключателя.

DrawFrameControl, кажется, масштабирует радиокнопку, чтобы соответствовать адресу, который я передаю, поэтому я должен быть близок к «правильному» размеру радио, который отключается от других (непривлекательных рисованных) радиостанций на экране.

Кто-нибудь знает, как это сделать?

ответ

2

Прошло некоторое время с тех пор, как я работал над этим, поэтому то, что я описываю, - это то, что я сделал, и не обязательно прямой ответ на вопрос.

Я использую битовые карты 13 x 13, а не 12 x 12. Растровая часть флажка, по-видимому, передается в WM_DRAWITEM. Тем не менее, я также создал WM_MEASUREITEM и накормил его теми же значениями, поэтому мой ответ вполне может быть «Просить вопрос» в правильном философском смысле.

 
     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; 

Это, похоже, хорошо работает как для Win2000, так и для XP, хотя я знаю, что может сделать Vista.

Возможно, стоит экспериментировать, чтобы увидеть, что не получается из WM_MEASUREITEM, хотя я обычно обнаруживаю со старым кодом, что у меня обычно была совершенно хорошая причина делать что-то, что выглядит излишним.

4

На этой странице показаны некоторые правила калибровки для элементов управления. Обратите внимание, что размеры приведены в обоих DLU (диалоговые единицы) и пикселей, в зависимости от того, вы помещаете элемент управления в диалоге или нет:

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

Я думал GetSystemMetrics API может вернуть стандартный размер для некоторые из общих элементов управления, но я ничего не нашел. Для определения размера может существовать общий API для конкретного управления.

Смежные вопросы