Das sind keine Ownerdrawn-Schaltflächen verwenden

Das Beispiel in diesem Abschnitt ist die Fensterprozedur für das Dialogfeld in der folgenden Abbildung dargestellt.

Die Kontrollkästchen und Optionsfelder im Dialogfeld Schaltflächen werden automatisch. Die Kontrollkästchen sind drei Status. Die Klaren Farben -Schaltfläche ist eine Standard-Schaltfläche. Die Kontrollkästchen, Optionsfeldern und Schaltflächen sind in der Header-Datei der Anwendung wie folgt definiert.

# define IDC_BOX1 101 / / das erste Kontrollkästchen # definieren IDC_BOX2 102 / / Sekunde das Kontrollkästchen # define IDC_BOX3 103 / / dritte Kontrollkästchen # definieren IDC_REDBACK 104 / / top Optionsfeld # define IDC_BLUEBACK 105 / / Radio-Button unten # define IDC_CLEARBOXES 107 / / top Taster # define IDC_CLEARBACK 108 / / unten-Taste 

 

Durch Klicken auf eines dieser Steuerelemente führt zu einer Änderung auf die Felder 1, 2 und 3. Sie müssen deklarieren und definieren die folgende Funktion zum Zeichnen der Felder 1, 2 und 3.

void BoxPainter (HWND hDlg, / / Fenster handle UINT uBox, / / LRESULT lState malen box);  / / Zustand der Box

 

Im folgenden Fenster benachrichtigt die WM_CTLCOLORDLG -Nachricht die Anwendung, die das Dialogfeld gezogen werden. Wenn der Benutzer die Schaltfläche Klare Farben (gekennzeichnet durch das fClearColor-Flag) drückt, verwendet die Prozedur die SendDlgItemMessage Funktion deaktivieren Sie die Kontrollkästchen und Optionsfeldern. Die BN_CLICKED -Nachricht enthält die Bezeichner der Schaltfläche, auf die geklickt wurde.

HBRUSH hbrRed, hbrBlue, hbrWhite; 
BOOL fRedBack, fBlueBack, fClearColor;  // background-state flags 

BOOL CALLBACK ButtonProc(HWND hDlg, UINT message, WPARAM wParam, 
                         LPARAM lParam) 
{ 
    LRESULT lState; 
 
    switch (message) 
    { 
        case WM_INITDIALOG: 
            hbrRed = CreateSolidBrush(RGB(255, 0, 0)); 
            hbrBlue = CreateSolidBrush(RGB(0, 0, 255)); 
            hbrWhite = GetStockObject(WHITE_BRUSH); 
            return TRUE; 
 
        case WM_CTLCOLORDLG: 
            if (fRedBack) 
            { 
                fRedBack = FALSE; 
                return (LRESULT) hbrRed; 
            } 
            else if (fBlueBack) 
            { 
                fBlueBack = FALSE; 
                return (LRESULT) hbrBlue; 
            } 
            else if (fClearColor) 
            { 
                fClearColor = FALSE; 
 
                // Uncheck all check boxes and radio buttons. 
                SendDlgItemMessage(hDlg,  // window handle 
                    IDC_BOX1,             // button identifier 
                    BM_SETCHECK,          // message 
                    0,                    // check state unchecked) 
                   0);                   // must be zero 
                SendDlgItemMessage(hDlg, IDC_BOX2, BM_SETCHECK, 0, 0); 
                SendDlgItemMessage(hDlg, IDC_BOX3, BM_SETCHECK, 0, 0); 
                SendDlgItemMessage(hDlg,IDC_REDBACK,BM_SETCHECK,0,0);
                SendDlgItemMessage(hDlg,IDC_BLUEBACK,BM_SETCHECK,0,0);
            } 
            return (LRESULT) hbrWhite; 
 
        case WM_COMMAND: 
                if (wParam == IDOK) 
                { 
                    EndDialog(hDlg, TRUE); 
                    return TRUE; 
                } 
 
                if (HIWORD(wParam) == BN_CLICKED) 
                { 
                    switch (LOWORD(wParam)) 
                    { 
                        case IDC_BOX1: 
 
                            // Retrieve the state of the check box. 
                            lState = SendDlgItemMessage( 
                                hDlg, IDC_BOX1, BM_GETSTATE, 
                                0, 0); 
 
                            BoxPainter(hDlg, 1, lState); 
                            break; 
 
                        case IDC_BOX2: 
                            lState = SendDlgItemMessage( 
                                hDlg, IDC_BOX2, BM_GETSTATE, 0, 0); 
                            BoxPainter(hDlg, 2, lState); 
                            break; 
 
                        case IDC_BOX3: 
                            lState = SendDlgItemMessage( 
                                hDlg, IDC_BOX3, BM_GETSTATE, 0, 0); 
                            BoxPainter(hDlg, 3, lState); 
                            break; 
 
                        case IDC_REDBACK: 
                            fRedBack = TRUE; 
                            InvalidateRect(hDlg, NULL, TRUE); 
                            break; 
 
                        case IDC_BLUEBACK: 
                            fBlueBack = TRUE; 
                            InvalidateRect(hDlg, NULL, TRUE); 
                            break; 
 
                        case IDC_CLEARBACK: 
                            fClearColor = TRUE; 
                            InvalidateRect(hDlg, NULL, TRUE); 
                            break; 
 
                        case IDC_CLEARBOXES: 
                            BoxPainter(hDlg, 4, (LRESULT) 0); 
                            break; 
                    } 
                } 
 
        case WM_DESTROY: 
            DeleteObject(hbrRed); 
            DeleteObject(hbrBlue); 
 
            // Do not delete hbrWhite, because it is a stock object.
 
            break; 
 
    } 
    return FALSE;       // did not process a message 
        UNREFERENCED_PARAMETER(lParam); 
} 
 

Index