यह कुछ समय हो गया है क्योंकि मैंने इस पर काम किया है, इसलिए मैं जो वर्णन कर रहा हूं वह है जो मैंने किया है, और यह आवश्यक रूप से प्रश्न का सीधा जवाब नहीं है।
मुझे 12 x 12 के बजाय बिट मैप्स 13 x 13 का उपयोग करना होता है। चेक बॉक्स का बिटमैप भाग 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 के लिए अच्छी तरह से काम करने लगता है हालांकि मैं एनबीओ विचार विस्टा क्या कर सकता है।
यह देखने के लिए एक प्रयोग के लायक हो सकता है कि WM_MEASUREITEM क्या छोड़ रहा है, हालांकि मुझे आमतौर पर पुराने कोड के साथ पता चलता है कि मुझे आमतौर पर अनावश्यक दिखने के लिए पूरी तरह से अच्छा कारण था।
स्रोत
2008-09-24 00:29:17