Aar*_*ark 8 windows user-interface winapi gdi
我正在使用DrawFrameControl绘制旧学校(未经训练 - 主题收音机是另一个问题)单选按钮:
DrawFrameControl(dc, &rectRadio, DFC_BUTTON, isChecked() ? DFCS_BUTTONRADIO | DFCS_CHECKED : DFCS_BUTTONRADIO);
Run Code Online (Sandbox Code Playgroud)
我从来没有能够找到一个确定的火线方法来弄清楚RECT要传递什么.我一直在使用一个12x12的矩形但我喜欢Windows告诉我一个单选按钮的大小.
DrawFrameControl似乎缩放单选按钮以适合我传递的矩形,因此我必须接近屏幕上其他(非所有者绘制的)无线电的无线电"右"尺寸.
有人知道怎么做吗?
我从事这个工作已经有一段时间了,所以我所描述的是我所做的,不一定是对问题的直接回答。
我碰巧使用位图 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, // 源位图高度
SRC复制);// 光栅操作
删除DC(hdcMem);
返回真;
这似乎对 Win2000 和 XP 都有效,尽管我不知道 Vista 可能会做什么。
可能值得进行一次实验来看看省略 WM_MEASUREITEM 会带来什么影响,尽管我通常会发现旧代码通常有充分的理由去做一些看起来多余的事情。