MFC控件变色功能设计总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17017545/article/details/79638967

1.在控件所属的类的定义中(.h文件)添加函数声明
2.在.cpp文件中的消息映射表中添加 ON_WM_CTLCOLOR()消息
3.在.cpp文件中添加消息处理函数 OnCtlColor 的实现

具体代码如下:(此处以Cpage2为例)
Cpage2.h

    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); //颜色控制 
    //该消息处理函数还要求返回一个画刷的句柄,用于在控件具体的绘制之前擦除其客户区。

Cpage2.cpp

//消息映射表
BEGIN_MESSAGE_MAP(Cpage2, CDialog)

ON_WM_CTLCOLOR() //添加消息

ON_CONTROL_RANGE(EN_CHANGE, IDC_EDIT_APN, IDC_EDIT_MOTION_THRESHOLD, CIntegrityMobileConfiguratorDlg::OnGtPage2Change)
ON_CONTROL_RANGE(BN_CLICKED, IDC_EDIT_APN, IDC_EDIT_MOTION_THRESHOLD, CIntegrityMobileConfiguratorDlg::OnGtPage2Change)
ON_CONTROL_RANGE(CBN_SELCHANGE, IDC_EDIT_APN, IDC_EDIT_MOTION_THRESHOLD, CIntegrityMobileConfiguratorDlg::OnGtPage2Change)

END_MESSAGE_MAP()

// Cpage2 消息处理程序
下面程序中检测每个控件时往右移位是因为在ON_CONTROL_RANGE()的消息响应函数中有CheckPage2Para()函数,在CheckPage2Para()函数中,当某个控件数据越界,就会左移,即当控件内数据越界时,下面程序中的 if() 判断为真

HBRUSH Cpage2::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    UINT nID = pWnd->GetDlgCtrlID(); //获取控件的IDBOOL isHiLite = FALSE;
    //nCtlColor: CTLCOLOR_EDIT, CTLCOLOR_MSGBOX, ...

    switch (nID)
    {
        case IDC_EDIT_APN:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>0)
            {
                pDC->SetTextColor(RGB(255, 255, 0));  //设置字体颜色(黄色)
                pDC->SetBkColor(RGB(255, 0, 0));  //设置背景颜色(红色)
            }
            break;
        case IDC_EDIT_RESEND_DURATION:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>1)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_RESEND_INTERVAL:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>2)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_BACKEND_SERVER1:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>4)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_SERVER_PORT1:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>5)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_BACKEND_SERVER2:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>6)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_SERVER_PORT2:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>7)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_SMS_NUMBER1:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>8)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_SMS_NUMBER2:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>9)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_SMS_NUMBER_ALERT:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>10)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_INCOMING_NUMBER1:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>11)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_INCOMING_NUMBER2:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>12)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_INCOMING_NUMBER3:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>13)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_INCOMING_NUMBER4:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>14)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_GPS_ON_TIME:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>15)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_CHECK_INTERVAL:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>16)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_NON_MOV:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>19)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;
        case IDC_EDIT_MOTION_THRESHOLD:        
            if(isHiLite = 1 & isCheckError[CFG_CHECK_CMD_PAGE2]>>20)
            {
                pDC->SetTextColor(RGB(255, 255, 0));
                pDC->SetBkColor(RGB(255, 0, 0));
            }
            break;  
       }
    return isHiLite? 0: CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}

附加 CheckPage2Para() 函数的代码

CFG_CHECK_RESULT CfgProcess::CheckPage2Para(char para[][MAX_CMD_PARA_LEN])
{
    isCheckError[CFG_CHECK_CMD_PAGE2] = 0;

    if(strlen(para[0])>40)//APN
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<0;
    if(!isAllDigit(para[1],10) || atoi(para[1])<0 || atoi(para[1])>24)//resend duration
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<1;
    if(!isAllDigit(para[2],10) || strlen(para[2])<0 || atoi(para[2])>20)//resend interval
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<2;
    if(!isAllDigit(para[3],10) || atoi(para[3])>6)//report mode
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<3;
    if(strlen(para[4])>60)//Backend Server1
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<4;
    if(!isAllDigit(para[5],10) || atoi(para[5])>65535)//Server port1
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<5;
    if(strlen(para[6])>60)//Backend Server2
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<6;
    if(!isAllDigit(para[7],10) || atoi(para[7])>65535)//Server port2
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<7;
    if(strlen(para[8])>20 || !isSmsNumber(para[8]))//SMS number1
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<8;
    if(strlen(para[9])>20 || !isSmsNumber(para[9]))//SMS number2
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<9;
    if(!isPhoneNumber(para[10]) || strlen(para[10])>20)//SMS gateway
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<10;
    if(strlen(para[11])>20 || !isPhoneNumber(para[11]))//phone number1
         isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<11;
    if(strlen(para[12])>20 || !isPhoneNumber(para[12]))//phone number2
         isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<12;
    if(strlen(para[13])>20 || !isPhoneNumber(para[13]))//phone number1
          isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<13;
    if(strlen(para[14])>20 || !isPhoneNumber(para[14]))//phone number2
          isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<14;

    if(!isAllDigit(para[15],10) || (atoi(para[15])<2 && strlen(para[15])>=1) || atoi(para[15])>20)//gps fix delay
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<15;
    if(!isAllDigit(para[16],10) || (atoi(para[16])<3 && strlen(para[16])>=1)|| atoi(para[16])>86400)//check interval1
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<16;
    if(!isAllDigit(para[17],10) || strlen(para[17])>1)//AGPS
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<17;

    if(!isAllDigit(para[18],10) || strlen(para[18])>1)//Motion Sensor
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<18;
    if(!isAllDigit(para[19],10) || (atoi(para[19])<1 && strlen(para[19])>=1) || atoi(para[19])>255)//non movement duration
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<19;
    if(!isAllDigit(para[20],10) || (atoi(para[20])<1 && strlen(para[20])>=1)|| atoi(para[20])>10)//movement threhold
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<20;

    if(isCheckError[CFG_CHECK_CMD_PAGE2])
    {
        isCheckError[CFG_CHECK_CMD_PAGE2] |= 1<<31;
        return CFG_CHECK_ERROR_PARA;
    }
    return CFG_CHECK_OK;
}

猜你喜欢

转载自blog.csdn.net/qq_17017545/article/details/79638967