📄 screen.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 + -