¼ÒÀ¯ÀÚ°¡ ±×¸° ´ÜÃßÀÇ ºÎ¸ð â ÀϹÝÀûÀ¸·Î ¹öư¿¡ ´ë ÇÑ ÃÖ¼ÒÇÑ 3 °³ÀÇ ¸Þ½ÃÁö¿¡ ÀÀ´ä: WM_INITDIALOG, WM_COMMAND¹× WM_DRAWITEM. ¼ÒÀ¯ÀÚ°¡ ±×¸° ´ÜÃß¿¡ ´ë ÇÑ WM_MEASUREITEM ¸Þ½ÃÁö¸¦ ó¸®ÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù.
¼ÒÀ¯ÀÚ°¡ ±×¸° ´ÜÃß ÆäÀÎÆ® ÇØ¾ß ÇÕ´Ï´Ù ½Ã½ºÅÛ WM_DRAWITEM ¸Þ½ÃÁöÀÇ lParam DRAWITEMSTRUCT ±¸Á¶¸¦ °¡¸®Å°´Â ºÎ¸ð À©µµ¿ì¸¦ º¸³À´Ï´Ù. ¸ðµç ¼ÒÀ¯ÀÚ À§ÁÖ ÄÁÆ®·ÑÀÌ ±¸Á¶¸¦ »ç¿ë ÇÏ ¿© ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ÄÁÆ®·ÑÀ» ÆäÀÎÆ® ÇÏ´Â µ¥ ÇÊ¿äÇÑ Á¤º¸¸¦ Á¦°ø ÇÕ´Ï´Ù. DRAWITEMSTRUCT ±¸Á¶Ã¼ÀÇ itemAction ¹× itemState ¸â¹ö´Â ¼ÒÀ¯ÀÚ°¡ ±×¸° ´ÜÃ߸¦ ±×¸®´Â ¹æ¹ýÀ» Á¤ÀÇÇÕ´Ï´Ù.
´ÙÀ½ ¿¹Á¦¿¡¼´Â ¼ÒÀ¯ÀÚ°¡ ±×¸° ´ÜÃß WM_INITDIALOG, WM_DRAWITEM, WM_COMMAND ¸Þ½ÃÁö¸¦ ó¸® ÇÏ´Â ¹æ¹ýÀ» º¸¿© ÁÝ´Ï´Ù. ÀÌ ¿¹Á¦¿¡¼´Â ÄÁÆ®·ÑÀÇ ¼±Åà ¿©ºÎ¿¡ µû¶ó ÄÁÆ®·Ñ¿¡ ´ë ÇÑ µÎ °¡Áö ºñÆ®¸Ê Áß Çϳª¸¦ ±×¸®´Â ¹æ¹ýÀ» º¸¿© ÁÝ´Ï´Ù. WM_DRAWITEM ¸Þ½ÃÁöÀÇ wParam ¸Å°³ º¯¼ö¸¦ »ç¿ë ÇÏ ¿© ÄÁÆ®·Ñ; ½Äº° ÇÏ´Â ÀϹÝÀûÀ¸·Î ÀÌ ¿¹Á¦¿¡¼ ´Ü ÇϳªÀÇ Á¦¾î °¡Á¤.
BOOL CALLBACK OwnDrawProc(HWND hDlg, UINT message, WPARAM wParam,
LPARAM lParam)
{
HDC hdcMem;
LPDRAWITEMSTRUCT lpdis;
switch (message)
{
case WM_INITDIALOG:
// hinst, hbm1 and hbm2 are defined globally.
hbm1 = LoadBitmap((HANDLE) hinst, "OwnBit1");
hbm2 = LoadBitmap((HANDLE) hinst, "OwnBit2");
return TRUE;
case WM_DRAWITEM:
lpdis = (LPDRAWITEMSTRUCT) lParam;
hdcMem = CreateCompatibleDC(lpdis->hDC);
if (lpdis->itemState & ODS_SELECTED) // if selected
SelectObject(hdcMem, hbm2);
else
SelectObject(hdcMem, hbm1);
// Destination
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
32, // source bitmap width
32, // source bitmap height
SRCCOPY); // raster operation
DeleteDC(hdcMem);
return TRUE;
case WM_COMMAND:
if (wParam == IDOK
|| wParam == IDCANCEL)
{
EndDialog(hDlg, TRUE);
return TRUE;
}
if (HIWORD(wParam) == BN_CLICKED)
{
switch (LOWORD(wParam))
{
case IDC_OWNERDRAW:
// application-defined processing
break;
}
}
break;
case WM_DESTROY:
DeleteObject(hbm1); // delete bitmaps
DeleteObject(hbm2);
break;
}
return FALSE;
UNREFERENCED_PARAMETER(lParam);
}