การใช้ปุ่มที่นั่นจะไม่เจ้าวาด

ตัวอย่างในส่วนนี้คือ กระบวนการหน้าต่างสำหรับกล่องโต้ตอบที่แสดงในภาพประกอบต่อไปนี้.

กล่องกาเครื่องหมายและปุ่มตัวเลือกในกล่องโต้ตอบของปุ่มอยู่โดยอัตโนมัติ กล่องกาเครื่องหมายอยู่สามสถานะ ปุ่มล้างสีเป็นปุ่มกดค่าเริ่มต้น กล่องกาเครื่องหมาย ปุ่มเรดิโอ และปุ่มจะถูกกำหนดในไฟล์ส่วนหัวของแอพลิเคชัน เป็นดังนี้.

#กำหนด IDC_BOX1 101 / / กล่องกาเครื่องหมายที่แรก#กำหนด IDC_BOX2 102 / / ที่สองกล่องกาเครื่องหมาย#กำหนด IDC_BOX3 103 / / กล่องกาเครื่องหมายที่สาม#กำหนด IDC_REDBACK 104 / / ด้านบนปุ่ม#กำหนด IDC_BLUEBACK 105 / / ล่างปุ่ม#กำหนด IDC_CLEARBOXES 107 / / ด้านบนปุ่มกด#กำหนด IDC_CLEARBACK 108 / / ล่างปุ่มกด 
 

คลิกที่ใดก็ได้ของตัวควบคุมเหล่านี้ผลการเปลี่ยนแปลงกับกล่อง 1, 2 และ 3 คุณต้องประกาศ และกำหนดฟังก์ชันต่อไปนี้เพื่อระบายสีกล่อง 1, 2 และ 3.

โมฆะ BoxPainter (HWND hDlg, / / หน้าต่างจัดการ UINT uBox, / / กล่องเพื่อระบายสี LRESULT lState);  / / รัฐของกล่อง
 

ในกระบวนการหน้าต่างต่อไป ความWM_CTLCOLORDLGจะแจ้งให้แอปพลิเคชันที่กล่องโต้ตอบเกี่ยวกับการวาด ถ้าผู้ใช้กดปุ่มล้างสี(signified โดยค่าสถานะ fClearColor), กระบวนการนี้ใช้ฟังก์ชันSendDlgItemMessageเพื่อยกเลิกเลือกกล่องกาเครื่องหมายและปุ่มตัวเลือกการ ตัวระบุของปุ่มที่ถูกคลิกแล้วประกอบด้วยข้อความแจ้งเตือนBN_CLICKED.

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