📄 charge.cpp
字号:
// Charge.cpp: implementation of the CCharge class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "lane_new.h"
#include "Charge.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern CLane_newApp theApp;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
// 输入车辆一般信息时调用本类
char CBusNormal::chBusClass;
char CBusNormal::chBusType;
UINT CBusNormal::nStatus;
CBusNormal::CBusNormal()
{
}
// 按键处理
BOOL CBusNormal::ProcessKeyboard(UINT nChar)
{
BOOL bLegalityFlag=FALSE;
// 不同的子状态对按键有不同的处理
switch(nStatus){
case SHOW_BUS_CLASS:
bLegalityFlag=ProcessKeyOfClass(nChar);
break;
case SHOW_FARE:
bLegalityFlag=ProcessKeyOfFare(nChar);
break;
}
if(CScreen::ProcessKeyboard(nChar))
bLegalityFlag=TRUE;
return bLegalityFlag;
}
// 等待输入车型窗口下的按键
BOOL CBusNormal::ProcessKeyOfClass(UINT nChar)
{
BOOL bLegalityFlag=FALSE;
if((nChar>=ONE_KEY)&&(nChar<=SIX_KEY)){
chBusClass=nChar-'0';
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,NORMAL_INPUT_BUS_CLASS);
} else {
switch(nChar){
case FIND_KEY: //查询黑名单车牌
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,NORMAL_CHECK_BLACKCAR);
break;
case GROUP_KEY: //处理车队
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,NORMAL_HAS_GROUP);
break;
case END_KEY: //交班
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,NORMAL_HAS_END);
break;
case REPEAT_PRINT_KEY: //处理重打票
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,REPEAT_PRINT_KEY);
break;
case TICKET_KEY: //重新发出定额票
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,TICKET_KEY);
break;
}
}
return bLegalityFlag;
}
// 价格时处理按键
BOOL CBusNormal::ProcessKeyOfFare(UINT nChar)
{
BOOL bLegalityFlag=FALSE;
switch(nChar){
case VALID_KEY: //操作员按“确认”键 打印
bLegalityFlag=TRUE;
chBusType=TYPE_NORMAL; //车类为正常车
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,NORMAL_ISSUE_COMPUTER_INVOICE);
break;
case TICKET_KEY: //按“定额票”键,
bLegalityFlag=TRUE;
chBusType=TYPE_NORMAL; //车类为正常车
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,NORMAL_ISSUE_RATION_INVOICE);
break;
case FREE_KEY: //操作员按“免征 键
bLegalityFlag=TRUE;
chBusType=TYPE_FREE; //车类为免征车
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,NORMAL_FREE_CAR);
break;
case ARMY_POLICE_KEY: //操作员按“军警车”键
bLegalityFlag=TRUE;
chBusType=TYPE_ARMY_POLICE; //车类为军车
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,NORMAL_POLICE_ARMY_CAR);
break;
case MONTH_KEY: //操作员按“月票”键
bLegalityFlag=TRUE;
chBusType=TYPE_MONTH; //车类为月票车
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,NORMAL_MONTH_CAR);
break;
case MODIFY_KEY: //操作员按“修改”键
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,MODIFY_KEY);
break;
}
return bLegalityFlag;
}
// 绘制工作窗口
CBusNormal::DrawWorkInfo(UINT nSlaveStatus)
{
nStatus=nSlaveStatus;
DrawTransInfo();
switch(nStatus){
case SHOW_BUS_CLASS:
DrawInputClass();
break;
case SHOW_FARE:
DrawFare();
break;
}
}
// 绘制输入车型窗口
void CBusNormal::DrawInputClass()
{
ClearWorkRange();
ClearTransInfo();
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();
chBusClass=0;
}
// 绘制价格窗口
void CBusNormal::DrawFare()
{
int nScreenX=theApp.nScreenX;
int nScreenY=theApp.nScreenY;
ClearWorkRange();
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;
CTransInfo m_clsTrans;
char tmpStr[20];
memset(tmpStr,0,20);
theApp.memDC.SelectObject(theApp.Font2);
sprintf(tmpStr,"车型 %.1d",chBusClass);
theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
nTop=nScreenY/2;
sprintf(tmpStr,"价格: 人民币 %.4d",m_clsTrans.Fare());
theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
theApp.memDC.SelectObject(theApp.Font1);
chBusType=TYPE_NORMAL; //缺省车类为正常车
DrawScreen();
}
// 返回车型
char CBusNormal::BusClass()
{
return chBusClass+'0';
}
// 返回车类
char CBusNormal::BusType()
{
return chBusType;
}
///////////////////////////////////////////////////////////////////
// 输入特殊军警免月票车辆信息时调用本类
char CAuthentication::strBusNO[10];
UINT CAuthentication::nStatus;
char CAuthentication::strBuff[10];
HBITMAP CAuthentication::hBitmap=0;
DWORD CAuthentication::nBmpAddr=0;
char * CAuthentication::pPictureData=NULL;
BOOL CAuthentication::bCodingModeFlag=FALSE;
CAuthentication::CAuthentication()
{
}
// 按键处理
BOOL CAuthentication::ProcessKeyboard(UINT nChar)
{
BOOL bLegalityFlag=FALSE;
// 不同的子状态对按键有不同的处理
switch(nStatus){
case SHOW_BUS_NO:
bLegalityFlag=ProcessKeyOfNO(nChar);
break;
case SHOW_FREE_NOTE:
bLegalityFlag=ProcessKeyOfFreeNote(nChar);
break;
}
if(CScreen::ProcessKeyboard(nChar))
bLegalityFlag=TRUE;
return bLegalityFlag;
}
// 等待输入车牌窗口下的按键
BOOL CAuthentication::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 CAuthentication::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 CAuthentication::ProcessKeyOfFreeNote(UINT nChar)
{
BOOL bLegalityFlag=FALSE;
switch(nChar){
case VALID_KEY:
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,AUTHENTICATION_FREE_CHECK_PASS);
break;
case CANCEL_KEY:
bLegalityFlag=TRUE;
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,nStatus,AUTHENTICATION_FREE_CHECK_NOPASS);
break;
}
return bLegalityFlag;
}
// 绘制工作窗口
CAuthentication::DrawWorkInfo(UINT nSlaveStatus)
{
nStatus=nSlaveStatus;
DrawTransInfo();
switch(nSlaveStatus){
case SHOW_BUS_NO:
DrawInputNO();
break;
case SHOW_FREE_NOTE:
DrawFreeNote();
break;
}
}
// 绘制输入车牌窗口
void CAuthentication::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);
CTransInfo m_clsTrans;
sprintf(tmpStr,"车型 %c",m_clsTrans.BusClass());
nLeft=nScreenX*3/16;
nTop=nScreenY*5/12;
theApp.memDC.SelectObject(theApp.Font2);
theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
theApp.memDC.SelectObject(theApp.Font1);
nLeft=nScreenX/8;
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 CAuthentication::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 CAuthentication::DrawFreeNote()
{
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);
memmove(tmpStr,"车牌号: ",18);
memmove(tmpStr+10,strBuff,strlen(strBuff));
nTop=nScreenY*5/12;
theApp.memDC.SelectObject(theApp.Font2);
theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
nTop=nScreenY/2;
CTransInfo m_clsTrans;
if(m_clsTrans.BusType()==TYPE_FREE){
theApp.memDC.DrawText("免征车牌无效",CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
} else {
theApp.memDC.DrawText("月票车牌无效",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 CAuthentication::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);
CTransInfo m_clsTrans;
sprintf(tmpStr,"车型 %c",m_clsTrans.BusClass());
nLeft=nScreenX*3/16;
nTop=nScreenY*5/12;
theApp.memDC.SelectObject(theApp.Font2);
theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
theApp.memDC.SelectObject(theApp.Font1);
nLeft=nScreenX/8;
nTop=nScreenY/2;
memset(tmpStr,0,40);
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 CAuthentication::ReleaseMemory()
{
if(pPictureData!=NULL){
delete [] pPictureData;
pPictureData=NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -