Het bovenliggende venster van een eigenaar getekende knop meestal op ten minste drie boodschappen voor de knop reageert: WM_INITDIALOG, WM_COMMANDen WM_DRAWITEM. Het is niet nodig voor het verwerken van het WM_MEASUREITEM bericht voor eigenaar getekende knoppen.
Wanneer u een eigenaar getekende knop schilderen moet, signaal het systeem het bovenliggende venster een WM_DRAWITEM waarvan lParam naar een structuur van DRAWITEMSTRUCT verwijst . Deze structuur met alle eigenaar getekende besturingselementen gebruiken zodat de toepassing met de informatie die nodig is voor het schilderen van het besturingselement. De itemAction en itemState leden van de DRAWITEMSTRUCT structuur definiëren hoe te schilderen een eigenaar getekende knop.
In het volgende voorbeeld ziet u hoe WM_INITDIALOG, WM_DRAWITEM en WM_COMMAND berichten voor eigenaar getekende knoppen te verwerken. In het volgende voorbeeld geeft aan hoe tekenen een van twee bitmaps voor een besturingselement, afhankelijk van of het besturingselement is geselecteerd. Meestal zou kunt u de parameter wParam van het bericht WM_DRAWITEM identificeren de controle; in dit voorbeeld, is maar één besturingselement uitgegaan.
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);
}