Cela fait un moment que j'ai travaillé dessus, donc ce que je décris est ce que j'ai fait, et pas nécessairement une réponse directe à la question.
Il m'arrive d'utiliser des mappes de bits 13 x 13 plutôt que 12 x 12. La partie bitmap de la case à cocher semble être transmise dans le WM_DRAWITEM. Cependant, j'avais aussi mis en place WM_MEASUREITEM et je lui ai donné les mêmes valeurs, alors ma réponse pourrait bien être "Mendier la question" dans le bon sens philosophique.
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;
Cela semble bien fonctionner pour Win2000 et XP, même si je ne sais pas ce que Vista pourrait faire.
Cela peut valoir la peine de faire une expérience pour voir ce que fait WM_MEASUREITEM, bien que je découvre habituellement avec l'ancien code que j'avais habituellement une bonne raison de faire quelque chose qui semble redondant.