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

📄 screen.cpp

📁 高速公路收费系统车道软件. 功能: 1 检测公路过往车辆 2 收费过程控制和数据采集 3 车辆信息和图片上传服务器.
💻 CPP
字号:
// Screen.cpp: implementation of the CScreen class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "lane_new.h"
#include "Screen.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

extern CLane_newApp theApp;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

UINT CScreen::nKeyValue;
//	设置缺省字体及缺省字体颜色、背景色
CScreen::CScreen()
{
	if(theApp.Font1!=0)	theApp.memDC.SelectObject(theApp.Font1);
	theApp.memDC.SetBkColor(RGB(0,0,0));		//设置字体背景色
	theApp.memDC.SetTextColor(RGB(255,255,255));//设置字体颜色
}

// 用一个等于屏幕尺寸的大黑框覆盖整个屏幕以便清屏
void CScreen::ClearScreen()
{
	int nScreenX=theApp.nScreenX;
	int nScreenY=theApp.nScreenY;
	theApp.memDC.PatBlt(0,0,nScreenX,nScreenY,BLACKNESS);
}

// 用一个适当尺寸的黑框覆盖收费信息区以便清除收费信息区
void CScreen::ClearWorkRange()
{
	int nScreenX=theApp.nScreenX;
	int nScreenY=theApp.nScreenY;
	int LineWidth=nScreenX/160;
	int Left=nScreenX/64-LineWidth;
	int Top=nScreenY/4-LineWidth;
	int Buttom=nScreenY*7/8-LineWidth;
	int Right=nScreenX*5/8+LineWidth;
	theApp.memDC.PatBlt(Left,Top,Right-Left,Buttom-Top,BLACKNESS);
}

//	需要更新屏幕时调用该函数
void CScreen::DrawScreen()
{
	theApp.m_pMainWnd->Invalidate(FALSE);
}

//	初始化屏幕,负责显示框架窗口、时间窗口等
void CScreen::Initial()
{
	DrawFrameWindow();
	DrawTimeWindow();
	DrawLogo();
}

//	本函数主要用于重载,派生自CScreen类的其他用户界面类通过重载该
//	函数来显示各自的内容
CScreen::DrawWorkInfo(UINT nSlaveStatus)
{
}

//	本函数主要用于重载,派生自CScreen类的其他用户界面类通过重载该
//	函数来判断操作员输入的按键是否合法
BOOL CScreen::ProcessKeyboard(UINT nChar)
{
	BOOL bLegalityFlag=FALSE;
	switch(nChar){
	case UP_KEY:
		bLegalityFlag=TRUE;
		nKeyValue=UP_KEY;
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,UP_KEY_PRESS,(LPARAM)nKeyValue);
		break;
	case DOWN_KEY:
		bLegalityFlag=TRUE;
		nKeyValue=DOWN_KEY;
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,DOWN_KEY_PRESS,(LPARAM)nKeyValue);
		break;
	case HAS_GO_KEY:
		bLegalityFlag=TRUE;
		nKeyValue=HAS_GO_KEY;
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_OPTION_FINISH,HAS_GO_KEY,0);
		break;
	}
	return bLegalityFlag;
}

UINT CScreen::KeyValue()
{
	return nKeyValue;
}

//	绘制车道信息框
void CScreen::DrawFrameWindow()
{
	int nScreenX=theApp.nScreenX;
	int nScreenY=theApp.nScreenY;
	int	nLeft=nScreenX/64;
	int nRight=nScreenX*5/8;
	int nTop=nScreenY/48;
	int nButtom=nScreenY*23/100;
	theApp.memDC.Rectangle(CRect(nLeft,nTop,nRight,nButtom));
	char tmpStr[40];
	if(theApp.Font2!=0) theApp.memDC.SelectObject(theApp.Font2);
	nLeft=nScreenX/20;
	nTop=nScreenY/24;
	CLaneInfo m_clsLane;
	memset(tmpStr,0,40);
	m_clsLane.GetPlazaName(tmpStr);
	theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
	nLeft=nScreenX*7/20;
	memset(tmpStr,0,40);
	sprintf(tmpStr,"车道:%.2u",m_clsLane.LaneNO());
	theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
	if(theApp.Font1!=0) theApp.memDC.SelectObject(theApp.Font1);
	nLeft=nScreenX/20;
	nTop=nScreenY/9;
	CStatInfo m_clsStat;
	switch(m_clsStat.LaneStatus()){
	case LANE_STATUS_CLOSE:
		theApp.memDC.DrawText("关闭状态",CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
		break;
	case LANE_STATUS_MAINTAIN:
		theApp.memDC.DrawText("维修状态",CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
		break;
	case LANE_STATUS_OPEN:
		theApp.memDC.DrawText("开启状态",CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
		break;
	}
	nLeft=nScreenX*29/80;
	char chWorkMode=m_clsStat.WorkMode();
	switch(chWorkMode){
	case WORK_MODE_TEST:
		theApp.memDC.DrawText("测试方式",CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
		break;
	case WORK_MODE_NORMAL:
		theApp.memDC.DrawText("正常方式",CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
		break;
	case WORK_MODE_SETUP:
		theApp.memDC.DrawText("设置模式",CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
		break;
	case WORK_MODE_EDIT:
		theApp.memDC.DrawText("编辑模式",CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
		break;
	}
	if(chWorkMode!=WORK_MODE_NULL){	//假如处于上班状态
		nLeft=nScreenX/20;
		nTop=nScreenY/6;
		memset(tmpStr,0,40);
		CTimeInfo m_clsTime;
		sprintf(tmpStr,"%s%.2d:%.2d","上岗时间:",
			m_clsTime.GetHour(),m_clsTime.GetMinute());
		switch(m_clsStat.ShiftNO()){
		case '1':
			strncat(tmpStr,"(早班)",6);
			break;
		case '2':
			strncat(tmpStr,"(中班)",6);
			break;
		case '3':
			strncat(tmpStr,"(晚班)",6);
			break;
		case '4':
			strncat(tmpStr,"(夜班)",6);
			break;
		}
		theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
		nLeft=nScreenX*29/80;
		memset(tmpStr,0,40);
		sprintf(tmpStr,"收费员号: %.5u",m_clsStat.CollectNO());
		theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
	}
	DrawScreen();
}

//	绘制时钟框
void CScreen::DrawTimeWindow()
{
	int nScreenX=theApp.nScreenX;
	int nScreenY=theApp.nScreenY;
	int nLeft=nScreenX/64;
	int nRight=nScreenX*7/32;
	int nTop=nScreenY*7/8;
	int nButtom=nScreenY*47/48;
	theApp.memDC.Rectangle(CRect(nLeft,nTop,nRight,nButtom));
	char tmpStr[26];
	memset(tmpStr,0,26);
	nTop=nScreenY*43/48;
	CTimeInfo m_clsTime;
	sprintf(tmpStr,"日期:%.4d/%.2d/%.2d",m_clsTime.GetYear(),
		m_clsTime.GetMonth(),m_clsTime.GetDay());
	theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
	nTop=nScreenY*15/16;
	memset(tmpStr,0,26);
	sprintf(tmpStr,"时间: %.2d:%.2d:%.2d ",m_clsTime.GetHour(),
		m_clsTime.GetMinute(),m_clsTime.GetSecond());
	theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
	DrawScreen();
}

//	绘制当前电脑票号码
void CScreen::DrawInvoiceWindow(long nValue)
{
	int nScreenX=theApp.nScreenX;
	int nScreenY=theApp.nScreenY;
	int	nLeft=nScreenX*125/192;
	int	nRight=nScreenX*63/64;
	int nTop=nScreenY*11/12;
	int nButtom=nScreenY*47/48;
	char tmpStr[32];
	memset(tmpStr,0,32);
	sprintf(tmpStr,"电脑票号码:%.7u",nValue);
	theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_CENTER|DT_TOP);
	DrawScreen();
}

//	绘制收费提示信息
void CScreen::DrawTransInfo()
{
	int nScreenX=theApp.nScreenX;
	int nScreenY=theApp.nScreenY;
	int nLeft=nScreenX/4;
	int nRight=nScreenX;
	int nTop=nScreenY*7/8;
	int nButtom=nScreenY*15/16;
	char tmpStr[32];
	memset(tmpStr,0,32);
	CTransInfo m_clsTrans;
	char chClass=m_clsTrans.BusClass();
	if(chClass==0) return;
	sprintf(tmpStr,"车型 %c",chClass);
	switch(m_clsTrans.BusType()){
	case TYPE_ARMY_POLICE:
		sprintf(tmpStr+strlen(tmpStr),"  %s","军警车");
		break;
	case TYPE_MONTH:
		sprintf(tmpStr+strlen(tmpStr),"  %s","月票车");
		break;
	case TYPE_FREE:
		sprintf(tmpStr+strlen(tmpStr),"  %s","免征车");
		break;
	default:
		sprintf(tmpStr+strlen(tmpStr),"  %s","本地车");
		break;
	}
	sprintf(tmpStr+strlen(tmpStr),"  价格:%.3d",m_clsTrans.Fare());
	theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
	DrawScreen();
}

//	清除交易信息
void CScreen::ClearTransInfo()
{
	int nScreenX=theApp.nScreenX;
	int nScreenY=theApp.nScreenY;
	int nLeft=nScreenX/4;
	int nRight=nScreenX;
	int nTop=nScreenY*7/8;
	int nButtom=nScreenY*15/16;
	char tmpStr[32];
	memset(tmpStr,0,32);
	memset(tmpStr,' ',31);
	theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
	DrawScreen();
}

//	绘制报警信息区
void CScreen::DrawAlarmInfo(char *str1)
{
	int nScreenX=theApp.nScreenX;
	int nScreenY=theApp.nScreenY;
	int nLeft=nScreenX*11/40;
	int nRight=nScreenX*5/8;
	int nTop=nScreenY*15/16;
	int nButtom=nScreenY;
	char tmpStr[20];
	memset(tmpStr,0,20);
	memset(tmpStr,' ',18);
	memmove(tmpStr,str1,strlen(str1));
	theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
	DrawScreen();
//	启动定时器,5s后清空提示信息
	SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,ALARM_INFO_TIMER,5000);
}

//	报警信息定时器:定时器超时后清空报警信息
void CScreen::ProcessAlarmTimerOut()
{
	int nScreenX=theApp.nScreenX;
	int nScreenY=theApp.nScreenY;
	int nLeft=nScreenX*11/40;
	int nRight=nScreenX*5/8;
	int nTop=nScreenY*15/16;
	int nButtom=nScreenY;
	char tmpStr[20];
	memset(tmpStr,0,20);
	memset(tmpStr,' ',18);
	theApp.memDC.DrawText(tmpStr,CRect(nLeft,nTop,nRight,nButtom),DT_LEFT|DT_TOP);
	DrawScreen();
}

//	定时器超时处理程序,本函数只是为了重载,缺省不动作
CScreen::ProcessTimerOut()
{
}

//	显示状态信息,本函数在测试菜单和卡筒菜单下重载以便显示操作
//	结果,缺省无动作
CScreen::DrawStatusInfo(char *pStr)
{
}

//	显示漳州发展公司图标
void CScreen::DrawLogo()
{
//	产生白框括住漳州发展公司图标
	int nScreenX=theApp.nScreenX;
	int nScreenY=theApp.nScreenY;
	int nTop=nScreenY/48;
	int nButtom=nScreenY*23/100;
	int	nLeft=nScreenX*53/64;
	int	nRight=nScreenX*63/64;
	theApp.memDC.MoveTo(nLeft,nTop);
	theApp.memDC.LineTo(nLeft,nButtom);
	theApp.memDC.LineTo(nRight,nButtom);
	theApp.memDC.LineTo(nRight,nTop);
	theApp.memDC.LineTo(nLeft,nTop);
//	获取漳州发展图标文件路径
	char strFileName[130];
	memset(strFileName,0,130);
	theApp.GetFullPath(strFileName);
	strcat(strFileName,"漳州发展.bmp");
//	读入BMP文件的内容
	FILE *fp1;
	if((fp1=fopen(strFileName,"rb"))==NULL) return;
	int nHeadLength=sizeof(BITMAPFILEHEADER);
//	首先读取BMP文件头信息,根据文件头信息申请内存
	BITMAPFILEHEADER bmpFileHead;
	fread(&bmpFileHead,sizeof(BITMAPFILEHEADER),1,fp1);
	char *pPictureData;
	pPictureData=new char[bmpFileHead.bfSize-sizeof(BITMAPFILEHEADER)];
	if(pPictureData==NULL) return;
	fread(pPictureData,bmpFileHead.bfSize-sizeof(BITMAPFILEHEADER),1,fp1);
	fclose(fp1);
//	产生漳州发展公司图标的位图
	HBITMAP hBitmap=::CreateDIBitmap(theApp.memDC,
		(BITMAPINFOHEADER *)pPictureData, CBM_INIT, 
			pPictureData+bmpFileHead.bfOffBits-sizeof(BITMAPFILEHEADER),
			(LPBITMAPINFO)pPictureData,DIB_RGB_COLORS);	//建立位图
	if(hBitmap==NULL){
		delete [] pPictureData;
		return;
	}
//	将漳州发展公司的图标绘制到内存DC上
	BITMAPINFOHEADER *bmpInfoHeader;
	bmpInfoHeader=(BITMAPINFOHEADER *)pPictureData;
	::SetDIBitsToDevice(theApp.memDC,nScreenX*53/64,nScreenY/48-7,
		nScreenX/6,nScreenX/6,0,0,0,bmpInfoHeader->biHeight,
		pPictureData+bmpFileHead.bfOffBits-sizeof(BITMAPFILEHEADER),
		(BITMAPINFO *)pPictureData,DIB_RGB_COLORS);
	delete [] pPictureData;
	pPictureData=NULL;
}

//	从编码表图片文件中读取图形数据到内存中
void CScreen::ReadBitmap(char *pFileName,char *pData,HBITMAP hBitmap,DWORD nBmpAddr)
{
//	读入BMP文件的内容
	FILE *fp1;
	if((fp1=fopen(pFileName,"rb"))==NULL) return;
//	首先读取BMP文件头信息,根据文件头信息申请内存
	BITMAPFILEHEADER bmpFileHead;
	fread(&bmpFileHead,sizeof(BITMAPFILEHEADER),1,fp1);
	fread(pData,bmpFileHead.bfSize-sizeof(BITMAPFILEHEADER),1,fp1);
	fclose(fp1);
	nBmpAddr=bmpFileHead.bfOffBits-sizeof(BITMAPFILEHEADER);
//	产生编码表图片的位图
	hBitmap=::CreateDIBitmap(theApp.memDC,
		(BITMAPINFOHEADER *)pData, CBM_INIT, 
			pData+nBmpAddr,
			(LPBITMAPINFO)pData,DIB_RGB_COLORS);	//建立位图
	if(hBitmap==NULL){
		delete [] pData;
		return;
	}
}

//	特别地:汉字或英文字母的编码和实际的编码表并非一一对应,例如,
//			用户输入“闽E”时只须输入编码01,而“闽E”对应的编码
//			为00E
char strSymbol[100][10]={
	"闽","闽E","闽EY","闽ET","闽D","A","I","Q","Y","",
	"粤","粤U","粤UY","粤UX","粤D","B","J","R","Z","",
	"军车","吉","川","港","青","C","K","S","","",
	"警车","琼","渝","台","湘","D","L","T","","",
	"浙","宁","贵","津","辽","E","M","U","","",
	"新","皖","云","内","沪","F","N","V","","",
	"冀","鲁","藏","桂","甘","G","O","W","","",
	"晋","豫","陕","鄂","赣","H","P","X","","",
	"苏","苏A","京","京A","京G","京GN","京GF","","","",
	"黄","蓝","黑","农用","无牌","澳","","","","免征"
};		//汉字或英文字母
char strEncode[100][10]={
	"00","00E","00EY","00ET","00D","A","I","Q","Y","",
	"10","10U","10UY","10UX","10D","B","J","R","Z","",
	"20","21","22","23","24","C","K","S","","",
	"30","31","32","33","34","D","L","T","","",
	"40","41","42","43","44","E","M","U","","",
	"50","51","52","53","54","F","N","V","","",
	"60","61","62","63","64","G","O","W","","",
	"70","71","72","73","74","H","P","X","","",
	"80","80A","82","82A","82G","82GN","82GF","","","",
	"","","92","","","95","","","",""
};		//汉字或英文字母对应的编码


//	返回指定坐标对应的汉字或符号
void CScreen::GetSymbol(int x,int y,char *pRetStr)
{
//	若坐标错误,直接返回
	int nIndex=x*10+y;
	if(nIndex>=100) return;
	memmove(pRetStr,strSymbol[nIndex],strlen(strSymbol[nIndex]));
}

//	返回指定坐标对应的编码
void CScreen::GetSymbolEncode(int x,int y,char *pRetStr)
{
//	若坐标错误,直接返回
	int nIndex=x*10+y;
	if(nIndex>=100) return;
	memmove(pRetStr,strEncode[nIndex],strlen(strEncode[nIndex]));
}

//	释放边界类调用位图时申请的静态内存
void CScreen::ReleaseMemory()
{
	CIndicationLamp m_clsLamp;
	m_clsLamp.ReleaseMemory();
	CAuthentication m_clsAbnormalCar;
	m_clsAbnormalCar.ReleaseMemory();
	CCheckBlackCar m_clsBlackCar;
	m_clsBlackCar.ReleaseMemory();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -