如何确定 Windows 单选按钮的按钮部分的大小
Posted
技术标签:
【中文标题】如何确定 Windows 单选按钮的按钮部分的大小【英文标题】:How to determine the size of the button portion of a Windows radio button 【发布时间】:2010-09-08 20:54:37 【问题描述】:我正在使用 DrawFrameControl 自己绘制旧学校(非主题 - 主题收音机是另一个问题)单选按钮:
DrawFrameControl(dc, &rectRadio, DFC_BUTTON, isChecked() ? DFCS_BUTTONRADIO | DFCS_CHECKED : DFCS_BUTTONRADIO);
我从来没有想出一个可靠的方法来确定 RECT 传递的内容。我一直在使用 12x12 矩形,但我希望 Windows 告诉我单选按钮的大小。
DrawFrameControl 似乎会缩放单选按钮以适应我通过的矩形,因此我必须接近从屏幕上其他(非所有者绘制的)收音机看的收音机的“正确”尺寸。
有人知道怎么做吗?
【问题讨论】:
【参考方案1】:自从我从事此工作以来已经有一段时间了,所以我所描述的是我所做的,而不一定是对问题的直接答案。
我碰巧使用了 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 有什么作用,尽管我通常会发现旧代码我通常有充分的理由去做一些看起来多余的事情。
【讨论】:
【参考方案2】:此页面显示了一些控件的尺寸指南。请注意,大小以 DLU(对话框单位)和像素为单位给出,具体取决于您是否将控件放在对话框上:
http://msdn.microsoft.com/en-us/library/aa511279.aspx#controlsizing
我认为GetSystemMetrics
API 可能会返回一些常用控件的标准大小,但我没有找到任何东西。可能有一个通用的特定于控件的 API 来确定大小。
【讨论】:
以上是关于如何确定 Windows 单选按钮的按钮部分的大小的主要内容,如果未能解决你的问题,请参考以下文章