Met behulp van knoppen die geen eigenaar zijn getrokken

In het voorbeeld in deze sectie is het venster procedure voor het dialoogvenster dat wordt weergegeven in de volgende afbeelding.

De selectievakjes en keuzerondjes van het dialoogvenster knoppen worden automatisch gemaakt. De selectievakjes worden drie statuswaarden. De Heldere kleuren knop is een drukknop standaard. De selectievakjes, keuzerondjes en drukknoppen zijn gedefinieerd in het header-bestand van de toepassing, als volgt.

# define IDC_BOX1 101 / / eerste check box # definiŽren IDC_BOX2 102 / / tweede selectievakje # define IDC_BOX3 103 / / derde selectievakje box # definiŽren IDC_REDBACK 104 / / top radio knop # define IDC_BLUEBACK 105 / / onderste keuzerondje # define IDC_CLEARBOXES 107 / / top drukknop # define IDC_CLEARBACK 108 / / onderste drukknop 
 

Te klikken op een van deze besturingselementen resulteert in een verandering aan de vakken 1, 2 en 3. U moet verklaren en definiŽren de volgende functie om te schilderen van de vakken 1, 2 en 3.

vOID BoxPainter (HWND hDlg, / / vensteringang UINT uBox, / / box te schilderen LRESULT lState);  / / staat van vak
 

In het volgende venster procedure waarschuwt het bericht WM_CTLCOLORDLG de toepassing waarmee het dialoogvenster is ongeveer te worden getrokken. Als de gebruiker op de knop van de Heldere kleuren (aangegeven door de vlag fClearColor), wordt de procedure de functie SendDlgItemMessage aan uncheck de selectievakjes en keuzerondjes. De BN_CLICKED melding bevat de id's van de knop waarop werd geklikt.

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