Das übergeordnete Fenster eines Ownerdrawn-Taste reagiert in der Regel auf mindestens drei Botschaften für die Schaltfläche: WM_INITDIALOG WM_COMMANDund WM_DRAWITEM. Es ist nicht erforderlich, beim Verarbeiten der WM_MEASUREITEM -Nachricht für Ownerdrawn-Schaltflächen.
Wenn Sie eine Ownerdrawn-Schaltfläche zeichnen müssen, sendet das System eine WM_DRAWITEM Nachricht deren lParam auf eine DRAWITEMSTRUCT -Struktur zeigt dem übergeordnete Fenster. Mithilfe dieser Struktur mit allen Ownerdrawn-Steuerelementen bereitstellen die Anwendung die Informationen, dass es erforderlich ist, um das Steuerelement zu zeichnen. Die ItemAction und ItemState Mitglieder der DRAWITEMSTRUCT -Struktur definieren, wie ein Ownerdrawn-Schaltfläche.
Im folgenden Beispiel wird veranschaulicht, wie WM_INITDIALOG, WM_DRAWITEM und WM_COMMAND-Nachrichten für Ownerdrawn-Schaltflächen zu verarbeiten. In diesem Beispiel wird veranschaulicht, wie zu einem von zwei Bitmaps für ein Steuerelement, je nachdem, ob das Steuerelement ausgewählt ist. Sie würden in der Regel den wParam -Parameter der WM_DRAWITEM Nachricht verwenden, um das Steuerelement zu identifizieren; in diesem Beispiel wird nur ein Steuerelement ausgegangen.
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);
}