自从我从事此工作以来已经有一段时间了,所以我所描述的是我所做的,而不一定是对问题的直接答案。
我碰巧使用了 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 有什么作用,尽管我通常会发现旧代码我通常有充分的理由去做一些看起来多余的事情。