Прошло некоторое время с тех пор, как я работал над этим, поэтому то, что я описываю, - это то, что я сделал, и не обязательно прямой ответ на вопрос.
Я использую битовые карты 13 x 13, а не 12 x 12. Растровая часть флажка, по-видимому, передается в WM_DRAWITEM. Тем не менее, я также создал WM_MEASUREITEM и накормил его теми же значениями, поэтому мой ответ вполне может быть «Просить вопрос» в правильном философском смысле.
case WM_MEASUREITEM:
lpmis = (LPMEASUREITEMSTRUCT) lParam;
lpmis->itemHeight = 13;
lpmis->itemWidth = 13;
break;
case WM_DRAWITEM:
lpdis = (LPDRAWITEMSTRUCT) lParam;
hdcMem = CreateCompatibleDC(lpdis->hDC);
if (lpdis->itemState & ODS_CHECKED) // if selected
{
SelectObject(hdcMem, hbmChecked);
}
else
{
if (lpdis->itemState & ODS_GRAYED)
{
SelectObject(hdcMem, hbmDefault);
}
else
{
SelectObject(hdcMem, hbmUnChecked);
}
}
StretchBlt(
lpdis->hDC, // destination DC
lpdis->rcItem.left, // x upper left
lpdis->rcItem.top, // y upper left
// The next two lines specify the width and
// height.
lpdis->rcItem.right - lpdis->rcItem.left,
lpdis->rcItem.bottom - lpdis->rcItem.top,
hdcMem, // source device context
0, 0, // x and y upper left
13, // source bitmap width
13, // source bitmap height
SRCCOPY); // raster operation
DeleteDC(hdcMem);
return TRUE;
Это, похоже, хорошо работает как для Win2000, так и для XP, хотя я знаю, что может сделать Vista.
Возможно, стоит экспериментировать, чтобы увидеть, что не получается из WM_MEASUREITEM, хотя я обычно обнаруживаю со старым кодом, что у меня обычно была совершенно хорошая причина делать что-то, что выглядит излишним.