Verwenden von Ownerdrawn-Schaltflächen

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); 
} 
 

Index