8

我正在使用 DrawFrameControl 自己绘制旧学校(非主题 - 主题收音机是另一个问题)单选按钮:

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

我从来没有想出一个可靠的方法来弄清楚 RECT 应该传递什么。我一直在使用 12x12 矩形,但我希望 Windows 告诉我单选按钮的大小。

DrawFrameControl 似乎缩放单选按钮以适合我通过的矩形,因此我必须接近收音机的“正确”尺寸,使其与屏幕上的其他(非所有者绘制的)收音机相隔。

有人知道怎么做吗?

4

2 回答 2

4

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

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

我以为GetSystemMetricsAPI 可能会返回一些常用控件的标准大小,但我没有找到任何东西。可能有一个通用的特定于控件的 API 来确定大小。

于 2008-09-24T00:44:33.287 回答
2

自从我从事这项工作以来已经有一段时间了,所以我所描述的是我所做的,而不一定是对这个问题的直接回答。

我碰巧使用的是 13 x 13 而不是 12 x 12 的位图。复选框的位图部分似乎是在 WM_DRAWITEM 中传递的。但是,我还设置了 WM_MEASUREITEM 并为其提供了相同的值,所以我的答案很可能是正确的哲学意义上的“乞求问题”。

        案例 WM_MEASUREITEM:
            lpmis = (LPMEASUREITEMSTRUCT) lParam;

            lpmis->itemHeight = 13;
            lpmis->itemWidth = 13;

            休息;


        案例 WM_DRAWITEM:
            lpdis = (LPDRAWITEMSTRUCT) lParam;
            hdcMem = CreateCompatibleDC(lpdis->hDC);  



            if (lpdis->itemState & ODS_CHECKED) // 如果选择
                {
                SelectObject(hdcMem, hbmChecked);
                }
            别的
                {
                if (lpdis->itemState & ODS_GRAYED)
                    {
                    SelectObject(hdcMem, hbmDefault);
                    }
                别的
                    {
                    SelectObject(hdcMem, hbmUnChecked);
                    }
                }
            拉伸Blt(
                lpdis->hDC, // 目标 DC
                lpdis->rcItem.left, // x 左上角
                lpdis->rcItem.top, // y 左上角

                // 接下来的两行指定宽度和
                // 高度。
                lpdis->rcItem.right - lpdis->rcItem.left,
                lpdis->rcItem.bottom - lpdis->rcItem.top,
                hdcMem, // 源设备上下文
                0, 0, // x 和 y 左上角
                13, // 源位图宽度
                13, // 源位图高度
                SRCCOPY); // 光栅操作

            删除DC(hdcMem);
            返回真;

这似乎适用于 Win2000 和 XP,尽管我不知道 Vista 可能会做什么。

看看省略 WM_MEASUREITEM 的作用可能值得做一个实验,尽管我通常会发现旧代码我通常有充分的理由去做一些看起来多余的事情。

于 2008-09-24T00:29:17.893 回答