版权声明:本文为博主原创文章,未经博主允许不得转载。 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(); //获取控件的ID 号
BOOL 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;
}