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

时间:2008-09-14 23:59:05

标签: windows user-interface winapi gdi

我正在使用DrawFrameControl绘制旧学校(未经训练 - 主题无线电是另外一个问题)单选按钮:

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

我从来没有能够找到一个确定的方法来弄清楚RECT要传递什么。我一直在使用一个12x12的矩形但我喜欢Windows告诉我单选按钮的大小。

DrawFrameControl似乎缩放单选按钮以适合我传递的矩形,所以我必须接近从屏幕上其他(非所有者绘制的)无线电看到的无线电的“右”尺寸。

任何人都知道如何做到这一点?

2 个答案:

答案 0 :(得分:4)

此页面显示控件的一些大小调整指南。请注意,大小以DLU(对话框单位)和像素给出,具体取决于您是否将控件放在对话框上:

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

我认为GetSystemMetrics API可能会返回某些常用控件的标准大小,但我没有找到任何内容。可能存在用于确定大小调整的通用控件特定API。

答案 1 :(得分: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都有效,不过我对nbo有什么想法可以做。

可能值得一个实验来看看遗漏了WM_MEASUREITEM的内容,尽管我通常会发现旧的代码,我通常有充分的理由去做一些看似多余的事情。