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

📄 charge.cpp

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

//	返回免费车车牌
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 + -