站场图显示模块详细设计.docx
《站场图显示模块详细设计.docx》由会员分享,可在线阅读,更多相关《站场图显示模块详细设计.docx(46页珍藏版)》请在冰豆网上搜索。
站场图显示模块详细设计
站场图显示模块
详细设计
站场图显示模块详细设计
1.引言
1.1.编写目的及背景
在CTC项目中,有多个模块需要显示站场图,且各个模块对站场图的显示和操作有不同需求,旧站场图模块抽象的功能较为单一,功能已经越来越不能满足各个模块的需求,各个模块各自实现了自己所需功能,各模块所实现的功能重复性较多,在此前提下,急需把各个模块所需功能提取出来,扩充旧站场图模块,编写新的站场图模块,新模块提取了各个模块需求的共性,且最大限度地满足各个模块的使用需求,在原有站场图模块的基础上,使其结构更加合理,条理清晰,易于扩充。
1.2.定义
站场图模块:
如未特别说明,指新站场图模块。
站场视图:
用来显示站场图的视图,其程序实现为CZctView类。
CZctView:
显示站场图的视图类。
CStation:
站场类,包含一个站的所有站场元素。
CStationSet:
站集类,包含有一个或多个站场类。
CZctElement:
所有站场图元素的基类,表示一个站场元素。
单站:
一个站场所有元素的集合,在程序中用CStation类表示。
站集:
单站的集合,在程序中由CStationSet类表示。
ZctElementList:
站场图元素列表,其为双向链表结构。
2.站场图模块的结构
站场图模块编写的总体原则为,把各个子功能,在物理和逻辑上都划分清晰,一个逻辑上的功能在物理上有一个实现文件与之对应,这样便于理解和以后的扩充,整个模块可以分为3部分,现分别描述如下:
一:
各个站场图元素,如“道岔”,“信号机”,“按钮”等,这部分主要是对站场图各个元素的抽象,不同的站场图元素用不同类进行抽象实现。
这部分主要放置在Src/ZctElements文件夹下,每一类元素对应一个文件。
现在实现的站场图元素有14种:
“按钮”,“箭头”,“表示灯”,“桥梁”,“道岔”,“道岔表示”,“绝缘节”,“信号机”,“信号楼”,“站台”,“脱轨器”,“车次窗”,“区段”和“文本”。
二:
站场元素的管理,即站和站集。
站包含一个站的元素列表,主要来管理这个站的元素,在程序中由CStation类实现。
站集包含一个或多个站,可以管理多个站。
在程序中由CStationSet来实现。
三:
站场和站集的显示。
程序中的CZctView类实现了站场和站集的显示,并支持多种对站场图的操作。
2.1.物理结构
模块的物理组织,即文件和文件夹的组织,模块的所有文件放在Zctxs文件夹中,其下的文件及文件夹如下:
inc:
存放模块中的所有头文件。
res:
存放模块使用的资源文件。
src:
程序源文件目录。
ZctModule.cpp:
站场图模块主文件。
为了方便模块的使用,其他模块如需要站场图模块,只要在项目中加入此一个文件即可,其包含了系统中的其他所有文件。
2.1.1.Inc目录
AnNiu.h:
按钮类的头文件
Arrow.h:
箭头类的头文件
BiaoShiDeng.h:
表示灯类的头文件
Bridge.h:
桥梁类的头文件
DaoCha.h:
道岔类的头文件
Dcbs.h:
道岔表示的头文件
DisplayPara.h:
显示设置结构头文件
IniFile.h:
读写INI文件类的头文件
Jyj.h:
绝缘节类的头文件
LogicKgl.h:
逻辑开关量类的头文件
RealKgl.h:
实际开关量类的头文件
Signal.h:
信号机类的头文件
SignStair.h:
信号楼类的头文件
StaDesktop.h:
站台类的头文件
Station.h:
车站类的头文件
StationSet.h:
站集类的头文件
Tgq.h:
脱轨器类的头文件
Train.h:
车列类的头文件
TrainNo.h:
车次窗类的头文件
WcqdorGd.h:
无岔区段或股道类的头文件
WenBen.h:
文本类的头文件
ZctElement.h:
抽象的站场图元素类的头文件
ZctElementCollection.h:
站场图元素集合类的头文件
ZctLoader.h:
站场图载入类的头文件
ZctSaver.h:
站场图保存类的头文件
ZctView.h:
站场图显示类的头文件
Zctxs.h:
预定义头文件
2.1.2.Res目录
2.1.3.Src目录
2.2.概述
站场图模块采用文档/视图结构,视图类(CZctView)用来显示站场图,文档类(CStation/CStationSet)来对单站和多站进行管理。
为了简化模块的使用,把单站看成是多站的特例进行统一处理。
CStatoinSet中含有CStation的链表,各个单站在站集中由一个双向链表串接在一起。
对站场元素进行抽象,用CZctElement类表示,其为抽象类,不能生成具体实例,所有实际的站场图元素都由该类派生,代表实际的站场图元素,如道岔,信号机等。
CStation中包含有一个站场元素列表(ZctElementList),站的所有站场元素均在该链表中。
站场图模块的编写没有考虑多线程程序的使用,如果在多线程程序中使用该模块,程序中要保证数据的一致性。
为了消除屏幕的闪烁,站场图的显示采用双缓冲,建立一个内存图,所有的绘图操作发生在内存图上,绘制好后再贴到屏幕上。
内存图的大小和屏幕的大小一致,在屏幕大小改变时为了减少频繁生成内存位图,在屏幕大小变小时不重新生成内存位图,而用原来的内存位图。
为了提高效率,减少绘制时的工作量,在绘制运行图元素时,仅绘制屏幕可见元素,略过不可见元素的绘制。
每个元素都有一个可视矩形区域,该区域不包括元素的名称,如果该区域和窗口视图区域(CZctView)有重叠,则认为该元素可见。
在站集多屏幕情形下,所有的元素都可见时,如果一个元素的状态发生变化,绘制一个站的所有元素,也会有非常大工作量,在模块中采取只绘制状态发生变化的元素。
但如此的话将会引发新的问题,即有些元素状态发生变化前后的画法不一致,这就要求首先清除元素,然后再按新的画法进行绘制,清除元素有多种方式,其一,就是取得元素的显示矩形,然后用视图背景色进行填充,这样会把此区域中的其他元素也清掉,对于“道岔”特别明显,这种方法也不能清掉元素的名称。
其二为用背景色重新绘制该元素,程序中即采取此种方法。
清除掉旧的状态,再按新状态绘制元素,仅绘制状态发生变化的元素,cpu占用率可降至最低。
当元素的状态发生变化,按新状态绘制后会引发另外一个问题,对于“股道”,其状态发生变化,重新绘制后,原来在上面的“按钮”,变成了在“股道”的下面,即在“股道”绘制后,也应该再绘制一下其上面的“按钮”元素。
为了解决这个问题,引入了一个“元素层次”,即每个元素都有一个层次,底层的按钮绘制后,也应该绘制在其上层的元素。
3.站场图模块设计说明
3.1.CZctView站场图视图类
3.1.1.概述
该类继承自CScrollView,用来显示站场图,为了简化程序设计,有一个指向站场图站集的指针,所有的站都按站集处理。
在类中有一间隔为0.1秒的定时器,在定时器中会递增ticks变量。
程序中所有时间间隔都依此为基准。
在该类中实现的功能有:
1.鼠标移动停留时对鼠标所指元素的提示框提示功能。
2.对内存位图的自动处理。
包括生成,窗口变大时的位图调整。
3.鼠标对站场图的拖动。
4.闪烁元素的自动绘制。
5.站场图的放大缩小。
如要使用站场图模块显示站场图,只要从该类派生出自己的类,增加自己所需的额外功能即可。
3.1.2.主要数据成员描述
private:
//鼠标移动时的嘀嗒值,用于计算鼠标没有移动的时间
intm_nMouseMoveTick;
CPointm_mouseLocPos;//鼠标当前的位置
CPointm_mouseDownPos;//鼠标按下的位置
boolm_bRedrawMemBitmap;//是否重画内存图
CToolTipCtrlm_tips;//提示窗口
CBitmapm_bgdBitmap;//内存图
CDC*m_pMemDC;//向内存图绘制的DC指针
public:
CStationSet*m_pStaSet;//显示的站集指针
protected:
CSizem_bgdBitmapSize;//内存图大小
3.1.3.主要函数描述
CDC*GetMemDC();
说明:
得到向内存图绘制的DC指针,绘制后不用释放,如对DC有的改变,使用后应恢复以前的设置。
参数:
无
返回值:
指向内存dc的指针。
voidGetLocViewRect(RECT&);
说明:
得到当前的逻辑显示区域。
即加上了把滚动条的值。
参数:
矩形结构引用
返回值:
无
voidSetElementsVisible();
说明:
设置元素的可见性,当滚动条滚动逻辑显示区域发生变化,或视图大小发生变化时,要重新设置站集中元素的可见性。
在以上说说的情况下,系统会自动处理。
该函数外界一般不会使用。
参数:
无
返回值:
无
voidGetLocPos(CPoint&);
说明:
屏幕坐标和逻辑视图坐标的装换。
即加上了把滚动条的值。
参数:
屏幕坐标值
返回值:
无
voidReDraw();
说明:
重新绘制内存图。
参数:
无
返回值:
无
voidFreshViewRect();
说明:
重新计算元素的可见性,并重画视图。
参数:
无
返回值:
无
voidZoom(floatscale);
说明:
放大站场图
参数:
scale:
!
=1.0放缩比例,相对于上次。
=1.0还原站场图的原始大小。
返回值:
无
voidSetZctBkColor(COLORREF);
说明:
设置背景颜色
参数:
颜色
返回值:
无
COLORREFGetZctBkColor();
说明:
得到背景颜色
参数:
无
返回值:
背景颜色
virtualvoidOnDraw(CDC*pDC);
说明:
绘制站场图
参数:
返回值:
无
voidSetStatusByKgl(MultiStationBuf*pBuf);
说明:
根据开关量设置站集状态,并重画状态改变的元素。
参数:
站集信息结构
返回值:
无
3.2.CStation站场类
3.2.1.概述
该类用于管理一个车站的所有元素。
有一个元素数组,来保存该站的所有元素。
该类实现的功能有:
1.载入保存一个站。
2.显示一个站。
3.设置站内元素的可见性。
4.放大缩小站场。
3.2.2.主要数据成员描述
protected:
//车站名称
stringm_name;
//要显示给站的视图的指针
CZctView*m_pZctView;
//站控状态(是否非常站控)
boolm_bCtrlStatus;
//背景色
COLORREFm_bkColor;
//x,y方向的放大系数
floatm_xScale;
floatm_yScale;
//从站场图配置文件读取的原始放缩比例,是放大缩小倍数的基数。
//该值初始化后,不会改变,在还原站场图时使用。
floatm_xScale0;
floatm_yScale0;
//原点偏移坐标
POINTm_offset;
//默认的画笔宽度
intm_nPenWidth;
//显示控制参数
CShowElementParam_showPara;
public:
//开关量数组
CTypedPtrArraym_RealKglArray;//实际开关量数组
CTypedPtrArraym_LogicKglArray;//逻辑开关量数组
//定义各种设备的数组
CZctElementCollectionm_zctElements;
//被选中元素列表
CZctElementCollectionm_selElements;
3.2.3.主要函数描述
voidResumeScale();
说明:
还原缩放比例,还原为从站场图文件中载入的缩放比例。
参数:
无
返回值:
无
floatGetScaleRatio();
说明:
得到站场图的放大比例,因为站场图x,y可以分别放大,用x方向的缩放比例来代替。
参数:
无
返回值:
站场图的放大比例
constchar*Get_Name();
说明:
取得车站名称。
参数:
无
返回值:
车站名称
voidSet_Name(constchar*name);
说明:
设置车站名称。
参数:
车站名称
返回值:
无
floatGet_XScale();
说明:
取得X方向的缩放比例。
参数:
无
返回值:
X方向的缩放比例
voidSet_XScale(floatval);
说明:
设置X方向的缩放比例。
参数:
X方向的缩放比例
返回值:
无
floatGet_YScale();
说明:
取得Y方向的缩放比例。
参数:
无
返回值:
Y方向的缩放比例
voidSet_YScale(floatval);
说明:
设置Y方向的缩放比例。
参数:
Y方向的缩放比例
返回值:
无
POINTGet_OrgOffset();
说明:
取得原点偏移坐标。
参数:
无
返回值:
原点偏移坐标
voidSet_OrgOffset(POINT&pt);
说明:
设置原点偏移坐标。
参数:
原点偏移坐标
返回值:
无
intGet_PenWidth();
说明:
取得默认的画笔宽度
参数:
无
返回值:
默认的画笔宽度
voidSet_PenWidth(int);
说明:
设置默认的画笔宽度
参数:
默认的画笔宽度
返回值:
无
CZctElement*GetElement(POINTpt,CZctElementCollection*pSelectedElements=NULL);
说明:
得到指定点处的元素。
参数:
pt:
指定的点
pSelectedElements:
保存选中控件的列表
返回值:
指定点处最上层的元素
voidGetElements(ObjectTypetype,CZctElementCollection&list);
说明:
得到指定类别的元素。
参数:
type:
要得到元素的类别
List:
保存指定类别元素的列表
返回值:
无
voidGetElemetsInRect(constRECT&rect,CZctElementCollection*pSelectedElements,boolbAll);
说明:
得到指定的矩形中的元素列表
参数:
rect:
矩形区域
pSelectedElements:
得到的元素列表
bAll:
true:
所有元素,包括不可见,和不需要显示的元素
false:
不包括不可见和不需要显示的元素
返回值:
无
voidClear();
说明:
清除站场图。
参数:
无
返回值:
无
virtualintDraw(CDC*pDC,CZctElementCollection*pElementList=NULL);
说明:
画指定的元素列表。
参数:
pDC:
DC指针
pElementList:
要画的元素列表
返回值:
画的元素个数
boolDraw(CDC*pDC,CZctElement*pElement,DRAWSTRUCT*pds=NULL);
说明:
画指定的元素。
参数:
pDC:
DC指针
pElement:
要画的元素指针
pds:
绘制元素的信息结构
返回值:
是否重画了该元素
boolGetCtrlStatus();
说明:
得到车站的站控状态。
此状态从大排队中获得。
参数:
无
返回值:
该站是否非常站控
virtualboolSearchKgl();
说明:
寻找每个元素的每个开关量所在大排队中的位置。
参数:
无
返回值:
是否寻找成功
virtualboolLoadFromFile(constchar*pszFileName);
说明:
从文件中载入站场图。
参数:
站场图文件的全路径
返回值:
是否载入成功
virtualboolSaveToFile(constchar*pszFileName);
说明:
保存站场图到文件。
参数:
要保存文件的全路径
返回值:
是否保存成功
voidGetZctRect(RECT&);
说明:
得到站场图的大小。
参数:
矩形结构引用
返回值:
无
voidSetElementsVisible(RECT&viewRect);
说明:
根据窗口大小,设置各个元素的可见性。
参数:
窗口大小
返回值:
无
voidUpdateElementRedrawList();
说明:
更新元素的重绘列表
参数:
无
返回值:
无
voidSetShowPara(ObjectTypetype,DWORDpara);
说明:
设置站内元素显示控制参数。
参数:
type:
要设置的元素类型
para:
显示参数
返回值:
无
DWORDGetShowPara(ObjectTypetype);
说明:
得到站内元素显示控制参数。
参数:
要得到显示控制参数的元素类型
返回值:
显示控制参数
intGetPenWidth();
说明:
得到画笔宽度,此处得到的画笔宽度是乘上缩放比例后的宽度。
参数:
无
返回值:
画笔宽度
virtualCZctElement*CreateElement(ObjectTypetype);
说明:
根据指定的类型创建一个元素。
参数:
指定的类型
返回值:
指向创建元素的指针
virtualvoidSetStatusByKgl(CDC*pDC,unsignedchar*pDigitBuf,intBufLen,
CZctElementCollection*pStaChangedList);
说明:
由开关量设置元素状态。
参数:
pDC:
DC指针
pDigitBuf:
指向开关量缓冲区的指针
BufLen:
开关量缓冲区长度
pStaChangedList:
保存状态改变的元素的列表
返回值:
无
BOOLGetKglStatus(KglTypeType,intXh,unsignedchar*pDigitBuf,intBufLen);
说明:
取开关量状态。
参数:
Type:
开关量类型
Xh:
开关量的序号
pDigitBuf:
指向开关量缓冲区的指针
BufLen:
开关量缓冲区长度
返回值:
开关量状态
voidGetFlashStateChanged(CZctElementCollection&);
说明:
得到闪烁状态改变的元素。
参数:
保存闪烁状态改变的元素列表
返回值:
无
voidFlashSync();
说明:
闪烁同步,使元素闪烁的初始状态相同。
参数:
无
返回值:
无
voidGetElementDisRect(RECT&r,CZctElement*pElement);
说明:
得到指定元素的显示区域。
参数:
r:
保存要得到元素的显示区域
pElement:
指定的元素
返回值:
无
voidToElementPoint(POINT&pt,CZctElement*pElement);
说明:
把点转换到没有偏移,缩放比例为1时的位置。
参数:
pt:
要转换的点
pElement:
元素指针
返回值:
无
DRAWSTRUCT&PrepareDrawStruct(CDC*pDC,DRAWSTRUCT&ds);
说明:
设置绘制元素的信息结构。
参数:
pDC:
DC指针
ds:
绘制元素的信息结构
返回值:
绘制元素的信息结构
voidClearDisplay(CDC*pDC,CZctElement*pElement);
说明:
清除指定的元素。
参数:
pDC:
DC指针
pElement:
指向要清除元素的指针
返回值:
无
voidClearDisplay(CDC*pDC,CZctElementCollection*pElementList=NULL);
说明:
清除指定的元素。
参数:
pDC:
DC指针
pElementList:
要清除元素的列表
返回值:
无
3.3.CStationSet站集类
3.3.1.概述
该类用于管理一个或多个车站。
有一个车站数组,来保存该各个车站。
该类实现的功能有:
1.载入保存一个站集。
2.显示一个站集。
3.设置站集内元素的可见性。
4.放大缩小站场。
3.3.2.主要数据成员描述
public:
//车站列表
ZctStationListm_staList;
protected:
//站集偏移量
POINTm_offset;
//X和Y方向上的缩放比例
floatm_xScale;
floatm_yScale;
//显示该站集的视图指针
CZctView*m_pZctView;
3.3.3.主要函数描述
CStationSet(CZctView*pZctView);
说明:
构造函数。
参数:
显示该对象的视图指针
CStationSet();
说明:
构造函数
参数:
无
virtualCStation*CreateStation();
说明:
创建一个单站对象。
参数:
无
返回值:
指向创建的单站的指针
voidSetView(CZctView*pZctView);
说明:
设置视图指针,如果在构造该对象时没有设置视图指针,在使用前必须调用该函数设置视图指针。
参数:
显示该站集的视图指针
返回值:
无
intDraw(CDC*pDC);
说明:
绘制站集。
参数:
DC指针
返回值:
绘制元素个数
intDraw(CDC*pDC,CZctElementCollection&list);
说明:
绘制指定的元素列表
参数:
pDC:
DC指针
list:
要绘制的元素列表
voidAddStation(CStation*pStation);
说明:
向站集中增加一个单站。
参数:
单站指