Utilizzando i pulsanti creati dal proprietario

La finestra padre di un pulsante dal proprietario in genere risponde ai messaggi di almeno tre per il pulsante: WM_INITDIALOG, WM_COMMANDe WM_DRAWITEM. Non necessario elaborare il messaggio WM_MEASUREITEM per i pulsanti creati dal proprietario.

Quando si deve dipingere un pulsante creati dal proprietario, il sistema invia un messaggio WM_DRAWITEM cui lParam punta a una struttura DRAWITEMSTRUCT finestra padre. Utilizzare questa struttura con tutti i controlli creati dal proprietario per fornire l'applicazione con le informazioni che richiede a dipingere il controllo. I membri di itemAction e itemState della struttura DRAWITEMSTRUCT definiscono come dipingere un pulsante creati dal proprietario.

Nell'esempio seguente viene illustrato come elaborare i messaggi WM_COMMAND, WM_DRAWITEM e WM_INITDIALOG per pulsanti creati dal proprietario. In questo esempio viene illustrato come disegnare una delle due immagini bitmap per un controllo, dipende se il controllo selezionato. Si avrebbe in genere utilizza il parametro wParam del messaggio WM_DRAWITEM per identificare il controllo; in questo esempio si presuppone un solo controllo.

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

Rimedio: Inserire il CD-ROM CD di MSDN Library.

Index