Как определить размер части кнопки переключателя Windows

8
задан Aardvark 14 September 2008 в 23:59
поделиться

2 ответа

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

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

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

4
ответ дан 5 December 2019 в 22:21
поделиться

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

Я, оказывается, использую битовые массивы 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, хотя у меня есть nbo идея, что могла бы сделать Vista.

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

2
ответ дан 5 December 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: