如何确定Windows单选按钮的按钮部分的大小

时间:2020-03-05 18:53:07  来源:igfitidea点击:

我使用DrawFrameControl自己绘制了旧学校(非主题主题的收音机是另一个问题):

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

我从来没有想出一种确定的方法来弄清楚RECT要传递的内容。我一直在使用12x12矩形,但我希望Windows告诉我单选按钮的大小。

DrawFrameControl似乎可以缩放单选按钮以适合我通过的矩形,因此我必须接近屏幕上其他(非所有者绘制的)无线电的"正确"尺寸。

有人知道怎么做吗?

解决方案

回答

自从我从事此工作已经有一段时间了,所以我所描述的只是我所做的,而不一定是对该问题的直接答案。

我恰好使用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会做什么,尽管我通常会发现旧代码中我通常有充分的理由去做看起来多余的事情。

回答

此页面显示了一些控件的大小准则。请注意,大小以DLU(对话单位)和像素给出,具体取决于我们是否将控件放置在对话框上:

http://msdn.microsoft.com/zh-CN/library/aa511279.aspx#controlsizing

我以为" GetSystemMetrics" API可能会返回一些常见控件的标准大小,但是我什么也没找到。可能会有一个通用的控件特定的API来确定大小。