⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 charge.cpp

📁 高速公路收费系统车道软件. 功能: 1 检测公路过往车辆 2 收费过程控制和数据采集 3 车辆信息和图片上传服务器.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -