Ved hjelp av eieren trukket knapper

Det overordnede vinduet i en eier trukket knappen vanligvis svarer på minst tre meldinger for knappen: WM_INITDIALOG, WM_COMMANDog WM_DRAWITEM. Det er ikke nødvendig å behandle meldingen WM_MEASUREITEM for eieren trukket knapper.

Når du må male en eier trukket knappen, sender systemet det overordnede vinduet en WM_DRAWITEM melding som har lParam peker til en DRAWITEMSTRUCT struktur. Bruk denne strukturen med eieren trukket kontroller for alle for å levere programmet med informasjonen den behøver for å male kontrollen. ItemAction og itemState medlemmer av DRAWITEMSTRUCT strukturen definere hvordan til å male en eier trukket-knappen.

Eksemplet nedenfor viser hvordan du WM_INITDIALOG, WM_DRAWITEM og WM_COMMAND-meldinger for eieren trukket knapper. Dette eksemplet beskriver hvordan du kan tegne en av to punktgrafikk for en kontroll, avhengig av om kontrollen er valgt. Du vil bruke parameteren wParam av meldingen WM_DRAWITEM for å angi kontrollen; i dette eksemplet antas det bare én kontroll.

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