📄 charge.cpp
字号:
}
// 返回免费车车牌
void CAuthentication::GetBusNO(char *pRetStr)
{
memmove(pRetStr,strBusNO,strlen(strBusNO));
}
/////////////////////////////////////////////////////////////////
// 输入查询黑名单车辆信息时调用本类
char CCheckBlackCar::strBusNO[10];
char CCheckBlackCar::strBuff[10];
HBITMAP CCheckBlackCar::hBitmap=0;
DWORD CCheckBlackCar::nBmpAddr=0;
char * CCheckBlackCar::pPictureData=NULL;
BOOL CCheckBlackCar::bCodingModeFlag=FALSE;
UINT CCheckBlackCar::nStatus;
CCheckBlackCar::CCheckBlackCar()
{
}
// 处理按键
BOOL CCheckBlackCar::ProcessKeyboard(UINT nChar)
{
BOOL bLegalityFlag=FALSE;
// 不同子状态对用户按键的响应不同
switch(nStatus){
case SHOW_INPUT_BLACKCAR:
bLegalityFlag=ProcessKeyOfNO(nChar);
break;
case SHOW_IS_BLACK:
bLegalityFlag=ProcessKeyOfBlackCar(nChar);
break;
}
if(CScreen::ProcessKeyboard(nChar))
bLegalityFlag=TRUE;
return bLegalityFlag;
}
// 等待输入车牌窗口下的按键
BOOL CCheckBlackCar::ProcessKeyOfNO(UINT nChar)
{
BOOL bLegalityFlag=FALSE;
// 输入的车牌即可能是字符的编码,也可能是数字,输入字符编码时必须
// 先切换为编码模式,然后输入两字节的数字,车道软件再自动切换回数
// 字输入模式
if((nChar>=ZERO_KEY)&&(nChar<=NINE_KEY)){
// 对数字键,若处于编码输入模式,调用编码输入处理函数;否则所输入
// 字符为车牌中的数字
if(bCodingModeFlag){
bLegalityFlag=ProcessKeyOfCodingMode(nChar);
} else {
int nLen1=strlen(strBuff);
int nLen2=strlen(strBusNO);
if(nLen1>=8){
memset(strBuff,0,10);
memset(strBusNO,0,10);
nLen1=nLen2=0;
}
strBuff[nLen1]=nChar;
strBusNO[nLen2]=nChar;
DrawInputNumber();
bLegalityFlag=TRUE;
}
} else {
switch(nChar){
case CANCEL_KEY:
// 假如正在输入汉字或字符编码,退出编码窗口
if(bCodingModeFlag){
bLegalityFlag=TRUE;
bCodingModeFlag=FALSE;
DrawInputNumber();
} else {
// 已经输入车牌后按取消键,丢弃已经输入的车牌;否则,返回上一界面
bLegalityFlag=TRUE;
if(strlen(strBuff)>0){
memset(strBuff,0,10);
memset(strBusNO,0,10);
bCodingModeFlag=FALSE;
DrawInputNumber();
} else {
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,AUTHENTICATION_INPUT_BUS_NO_CANCEL);
}
}
break;
case VALID_KEY:
// 只有输入车牌后才允许按有效键
if(strlen(strBuff)>0){
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,AUTHENTICATION_INPUT_BUS_NO_OK);
}
break;
case CODING_KEY: //转换到编码输入模式
bLegalityFlag=TRUE;
bCodingModeFlag=TRUE;
DrawEncodeWindow();
break;
}
}
return bLegalityFlag;
}
// 处理位于编码模式下时输入数字键
BOOL CCheckBlackCar::ProcessKeyOfCodingMode(UINT nChar)
{
BOOL bLegalityFlag=TRUE;
// 每个字符用两个数字来编码
static int strCode[2];
static BOOL bFirstByteFlag=TRUE;
if(bFirstByteFlag){
bFirstByteFlag=FALSE;
strCode[0]=nChar-'0';
strCode[1]=0;
} else {
bFirstByteFlag=TRUE;
strCode[1]=nChar-'0';
// 假如已经输入汉字,禁止再输入汉字。英文字母编码的Y坐标不小于5
// 特别地:车牌中的汉字只能位于车牌最前面
if((strlen(strBusNO)>0)&&(strCode[1]<5)){
bLegalityFlag=FALSE;
}
// 输入的车牌长度不能超过8个字符
if(strlen(strBusNO)>=8) bLegalityFlag=FALSE;
if(bLegalityFlag){
GetSymbol(strCode[0],strCode[1],strBuff+strlen(strBuff));
GetSymbolEncode(strCode[0],strCode[1],strBusNO+strlen(strBusNO));
}
bCodingModeFlag=FALSE;
DrawInputNumber();
}
return bLegalityFlag;
}
// 等待确认黑名单查询结果时处理按键
BOOL CCheckBlackCar::ProcessKeyOfBlackCar(UINT nChar)
{
BOOL bLegalityFlag=FALSE;
switch(nChar){
case VALID_KEY:
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,BLACK_CAR_NOPASS);
break;
case CANCEL_KEY:
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,BLACK_CAR_PASS);
break;
}
return bLegalityFlag;
}
// 绘制工作窗口
CCheckBlackCar::DrawWorkInfo(UINT nSlaveStatus)
{
nStatus=nSlaveStatus;
DrawTransInfo();
switch(nSlaveStatus){
case SHOW_INPUT_BLACKCAR:
DrawInputNO();
break;
case SHOW_IS_BLACK:
DrawBlackCarNote();
break;
}
}
// 绘制输入车牌窗口
void CCheckBlackCar::DrawInputNO()
{
ClearWorkRange();
int nScreenX=theApp.nScreenX;
int nScreenY=theApp.nScreenY;
int nLeft=nScreenX/8;
int nRight=nScreenX*17/32;
int nTop=nScreenY*3/8;
int nButtom=nScreenY*17/24;
theApp.memDC.Rectangle(CRect(nLeft,nTop,nRight,nButtom));
char tmpStr[40];
memset(tmpStr,0,40);
nTop=nScreenY*5/12;
theApp.memDC.DrawText("查询黑名单违章车",CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
nTop=nScreenY/2;
theApp.memDC.SelectObject(theApp.Font2);
theApp.memDC.DrawText(" 输入车牌: ",CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
theApp.memDC.SelectObject(theApp.Font1);
DrawScreen();
memset(strBusNO,0,10);
memset(strBuff,0,10);
}
// 绘制输入的车牌数字
void CCheckBlackCar::DrawInputNumber()
{
ClearWorkRange();
int nScreenX=theApp.nScreenX;
int nScreenY=theApp.nScreenY;
int nLeft=nScreenX/8;
int nRight=nScreenX*17/32;
int nTop=nScreenY*3/8;
int nButtom=nScreenY*17/24;
theApp.memDC.Rectangle(CRect(nLeft,nTop,nRight,nButtom));
char tmpStr[40];
memset(tmpStr,0,40);
nTop=nScreenY*5/12;
theApp.memDC.DrawText("查询黑名单违章车",CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
nTop=nScreenY/2;
memmove(tmpStr," 输入车牌: ",24);
memmove(tmpStr+14,strBuff,strlen(strBuff));
theApp.memDC.SelectObject(theApp.Font2);
theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
theApp.memDC.SelectObject(theApp.Font1);
DrawScreen();
}
// 绘制编码表
void CCheckBlackCar::DrawEncodeWindow()
{
int nScreenX=theApp.nScreenX;
int nScreenY=theApp.nScreenY;
ClearWorkRange();
// 假如尚未读取图标文件,读取图标文件
if(pPictureData==NULL){
// 获取编码表图片文件路径
char strFileName[130];
memset(strFileName,0,130);
theApp.GetFullPath(strFileName);
strcat(strFileName,"编码表.bmp");
FILE *fp1;
if((fp1=fopen(strFileName,"rb"))==NULL) return;
// 首先读取BMP文件头信息,根据文件头信息申请内存
BITMAPFILEHEADER bmpFileHead;
fread(&bmpFileHead,sizeof(BITMAPFILEHEADER),1,fp1);
fclose(fp1);
pPictureData=new char[bmpFileHead.bfSize-sizeof(BITMAPFILEHEADER)];
if(pPictureData==NULL) return;
ReadBitmap(strFileName,pPictureData,hBitmap,nBmpAddr);
}
// 将报警灯的图标绘制到内存DC上
BITMAPINFOHEADER *bmpInfoHeader;
bmpInfoHeader=(BITMAPINFOHEADER *)pPictureData;
::SetDIBitsToDevice(theApp.memDC,nScreenX/64+61,nScreenY*4/15+38,
365,244,0,0,0,bmpInfoHeader->biHeight,
pPictureData+nBmpAddr,
(BITMAPINFO *)pPictureData,DIB_RGB_COLORS);
DrawScreen();
}
// 绘制信息窗口
void CCheckBlackCar::DrawBlackCarNote()
{
ClearWorkRange();
int nScreenX=theApp.nScreenX;
int nScreenY=theApp.nScreenY;
int nLeft=nScreenX/8;
int nRight=nScreenX*17/32;
int nTop=nScreenY*9/24;
int nButtom=nScreenY*17/24;
theApp.memDC.Rectangle(CRect(nLeft,nTop,nRight,nButtom));
char tmpStr[40];
memset(tmpStr,0,40);
nTop=nScreenY*10/24;
theApp.memDC.SelectObject(theApp.Font2);
theApp.memDC.DrawText("黑名单违章车",CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
nTop=nScreenY*12/24;
sprintf(tmpStr,"车牌号: %s",strBuff);
theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
theApp.memDC.SelectObject(theApp.Font1);
nTop=nScreenY*2/3;
theApp.memDC.DrawText("按确认 / 取消",CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
DrawScreen();
}
// 返回车牌
void CCheckBlackCar::GetBusNO(char *pRetStr)
{
memmove(pRetStr,strBusNO,strlen(strBusNO));
}
// 释放存储编码表图片信息的内存
void CCheckBlackCar::ReleaseMemory()
{
if(pPictureData!=NULL){
delete [] pPictureData;
pPictureData=NULL;
}
}
///////////////////////////////////////////////////////////////////
UINT CViolate::nStatus;
CViolate::CViolate()
{
}
// 处理按键
BOOL CViolate::ProcessKeyboard(UINT nChar)
{
BOOL bLegalityFlag=FALSE;
CCxpInfo m_clsCxp;
CStatInfo m_clsStat;
switch(nChar){
case VALID_KEY: //收费员确认发生违章
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CLOSE_TIMER,WORK_WINDOW_TIMER,0);
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,VIOLATE_OK,0);
break;
case CANCEL_KEY: //收费员判断实际未违章
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CLOSE_TIMER,WORK_WINDOW_TIMER,0);
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,VIOLATE_CANCEL,0);
break;
}
if(CScreen::ProcessKeyboard(nChar))
bLegalityFlag=TRUE;
return bLegalityFlag;
}
// 绘制工作窗口
CViolate::DrawWorkInfo(UINT nSlaveStatus)
{
nStatus=nSlaveStatus;
DrawTransInfo();
switch(nSlaveStatus){
case SHOW_VIOLATE:
DrawViolate();
break;
}
}
// 绘制违章窗口
void CViolate::DrawViolate()
{
ClearWorkRange();
int nScreenX=theApp.nScreenX;
int nScreenY=theApp.nScreenY;
int nLeft=nScreenX/8;
int nRight=nScreenX*17/32;
int nTop=nScreenY*3/8;
int nButtom=nScreenY*17/24;
theApp.memDC.Rectangle(CRect(nLeft,nTop,nRight,nButtom));
nTop=nScreenY*11/24;
if(theApp.Font2!=0) theApp.memDC.SelectObject(theApp.Font2);
theApp.memDC.DrawText("违 章",CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
if(theApp.Font1!=0) theApp.memDC.SelectObject(theApp.Font1);
nTop=nScreenY*7/12;
theApp.memDC.DrawText("确认键 ---> 冲关 ",CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
nTop=nScreenY*5/8;
theApp.memDC.DrawText("取消键 ---> 误报警",CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
DrawScreen();
// 启动30秒定时器,若定时器超时前操作员未进行选择,本次违章被认为是冲卡
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,WORK_WINDOW_TIMER,30000);
}
// 若30秒内不选择,本次违章被判断为冲卡
CViolate::ProcessTimerOut()
{
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,VIOLATE_OK,0);
}
UINT CGroup::nStatus;
UCHAR CGroup::chGroupClass;
CGroup::CGroup()
{
}
// 处理按键
BOOL CGroup::ProcessKeyboard(UINT nChar)
{
BOOL bLegalityFlag=FALSE;
// 不同子状态对用户按键的响应不同
switch(nStatus){
case SHOW_GROUP_CLASS:
bLegalityFlag=ProcessKeyOfClass(nChar);
break;
case SHOW_GROUP:
bLegalityFlag=ProcessKeyOfGroup(nChar);
break;
}
// 本类所有子状态对以下按键的处理相同
CCxpInfo m_clsCxp;
CStatInfo m_clsStat;
if(CScreen::ProcessKeyboard(nChar))
bLegalityFlag=TRUE;
return bLegalityFlag;
}
// 输入车型窗口下处理按键
BOOL CGroup::ProcessKeyOfClass(UINT nChar)
{
BOOL bLegalityFlag=FALSE;
if((nChar>=ONE_KEY)&&(nChar<=SEVEN_KEY)){
chGroupClass=nChar-'0';
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,GROUP_CLASS_OK);
} else {
switch(nChar){
case GROUP_KEY:
case CANCEL_KEY:
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,CANCEL_KEY);
break;
}
}
return bLegalityFlag;
}
// 车队窗口下处理按键
BOOL CGroup::ProcessKeyOfGroup(UINT nChar)
{
BOOL bLegalityFlag=FALSE;
switch(nChar){
case GROUP_KEY:
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,GROUP_KEY_PRESS);
break;
}
return bLegalityFlag;
}
// 绘制工作窗口
CGroup::DrawWorkInfo(UINT nSlaveStatus)
{
nStatus=nSlaveStatus;
DrawTransInfo();
switch(nSlaveStatus){
case SHOW_GROUP_CLASS:
DrawGroupClass();
break;
case SHOW_GROUP:
DrawGroup();
break;
}
}
// 绘制输入车队车型窗口
void CGroup::DrawGroupClass()
{
ClearWorkRange();
int nScreenX=theApp.nScreenX;
int nScreenY=theApp.nScreenY;
int nLeft=nScreenX/8;
int nRight=nScreenX*17/32;
int nTop=nScreenY*3/8;
int nButtom=nScreenY*17/24;
theApp.memDC.Rectangle(CRect(nLeft,nTop,nRight,nButtom));
nLeft=nScreenX*3/16;
nTop=nScreenY*5/12;
theApp.memDC.SelectObject(theApp.Font2);
theApp.memDC.DrawText("车型",CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
nTop=nScreenY/2;
theApp.memDC.SelectObject(theApp.Font1);
theApp.memDC.DrawText("输入车队车型:",CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
DrawScreen();
chGroupClass=2; //车队的缺省车型为2型
}
// 绘制拖车窗口
void CGroup::DrawGroup()
{
int nScreenX=theApp.nScreenX;
int nScreenY=theApp.nScreenY;
char tmpStr[40];
memset(tmpStr,0,40);
sprintf(tmpStr,"车型 %.1d",chGroupClass);
int nLeft=nScreenX*3/16;
int nRight=nScreenX*17/32;
int nTop=nScreenY*5/12;
int nButtom=nScreenY*17/24;
theApp.memDC.SelectObject(theApp.Font2);
theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
theApp.memDC.SelectObject(theApp.Font1);
nTop=nScreenY/2;
memset(tmpStr,0,40);
CTransInfo m_clsTrans;
sprintf(tmpStr,"已通过车辆数目: %.3d",m_clsTrans.GroupNumber());
theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
DrawScreen();
}
// 获取车队车型
UCHAR CGroup::GroupClass()
{
return chGroupClass+'0';
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -