私がこれに取り組んでからしばらく経ちましたので、私が説明しているのは私がしたことであり、必ずしも質問に対する直接の答えではありません。
たまたま12x12ではなく13x13のビットマップを使用しています。チェックボックスのビットマップ部分が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);
}
}
StretchBlt(
lpdis-> hDC、//宛先DC
lpdis-> rcItem.left、//x左上
lpdis-> rcItem.top、//y左上
//次の2行は、幅と
// 身長。
lpdis-> rcItem.right-lpdis-> rcItem.left、
lpdis-> rcItem.bottom-lpdis-> rcItem.top、
hdcMem、//ソースデバイスコンテキスト
0、0、//左上のxとy
13、//ソースビットマップ幅
13、//ソースビットマップの高さ
SRCCOPY); //ラスター操作
DeleteDC(hdcMem);
TRUEを返します。
これはWin2000とXPの両方でうまく機能しているようですが、Vistaで何ができるかはわかりません。
WM_MEASUREITEMを除外するとどうなるかを確認することは、実験する価値があるかもしれませんが、私は通常、古いコードで、冗長に見えることを行うのに完全に正当な理由があることを発見します。