소유자가 그린 단추의 부모 창 일반적으로 버튼에 대 한 최소한 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);
}