Met behulp van eigenaar getekende knoppen

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

Index