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