Utilizzando i pulsanti che sono proprietario trainata

L'esempio in questa sezione la routine della finestra per la finestra di dialogo mostrata nella figura seguente.

Le caselle di controllo e pulsanti di opzione nella finestra di dialogo pulsanti sono automatiche. Le caselle di controllo sono tre stati. Il pulsante Colori chiari un pulsante predefinito. Le caselle di controllo, pulsanti di opzione e pulsanti di comando sono definiti nel file di intestazione dell'applicazione, come segue.

# define IDC_BOX1 101 / / primo check box # definire IDC_BOX2 102 / / seconda casella di controllo # define IDC_BOX3 103 / / terzo check box # definire IDC_REDBACK 104 / / top radio button # define IDC_BLUEBACK 105 / / pulsante in basso # define IDC_CLEARBOXES 107 / / top premere il pulsante # define IDC_CLEARBACK 108 / / premere il pulsante in basso 
 

Facendo clic su uno qualsiasi di questi controlli provoca un cambiamento nelle caselle 1, 2 e 3. necessario dichiarare e definire la seguente funzione di dipingere le caselle 1, 2 e 3.

public static void BoxPainter (HWND hDlg, / / handle di finestra UINT uBox, / / box per dipingere LRESULT lState);  / / stato della casella di
 

Nella procedura seguente finestra, il messaggio WM_CTLCOLORDLG notifica all'applicazione che deve essere disegnato nella finestra di dialogo. Se l'utente preme il pulsante di Colori chiari (identificato dalla bandiera fClearColor), la routine utilizza la funzione di SendDlgItemMessage a deselezionare le caselle di controllo e pulsanti di opzione. Il messaggio di notifica BN_CLICKED contiene gli identificatori del pulsante selezionato.

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

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

Index