王永刚,钱雪军,叶华平,姚 军
(1.同济大学 电气工程系,上海 200331;2.上海轨道交通培训中心,上海 201100)
城轨列车模拟运行报告是了解和改善列车运行性能的一个重要工具。报告涵盖列车模拟运行的各个方面,使工程人员能够获得更多的列车信息以便进行列车运行的优化。城轨列车模拟运行报告的内容包括3个方面:(1)文字:通过程序代码控制报告中文字的字体、颜色、大小以及对齐方式等;(2)图形:在城轨列车模拟运行期间会产生大量的图形且需要横向显示,这就涉及到图形的插入存储以及图形的横向设置;(3)表格:需要在报告中插入行驶数据的表格,这就涉及到表格插入、数据填充以及部分单元格合并。对城轨列车模拟运行报告自动生成进行研究,应确定报告格式,本软件采用Word报告的形式。
自动生成城轨列车模拟运行报告要先了解如何生成文档,Word中的每一个操作都是对其对象的操作。Word中包括很多对象,如文档、对话框、图表、文本框和图形等,而Word本身也是对象。这些对象都有自己的方法和属性。由于Word本身是一个实现自动化的COM组件,因此可以通过COM接口使用编程的方式来访问这些对象,改变它们的属性以完成对Word文档的自动化操作及一些特殊的应用,从而最终生成运行报告。需要用到的Word对象如表1所示。
表1 Word对象
有了上述了解,通过添加Word类型库,将表1中的全部对象添加至工程,并声明要用到的类对象,启动Word应用程序,新建一个空白的文档,就可以进行城轨列车模拟运行报告自动生成的实现了。
在创建了新空白文档后,利用Word类对象进行编程,自动化控制Word的内容。本文以北京地铁8号线为例,首先在Word文本的第1行,用3号字、粗体、居中显示文本标题“北京地铁8号线下行性能计算”。实现方法是用Paragraphs类设置对齐方式,用Selection类加载文字内容,用Font类设置字体格式和大小,如:
strcpy_s(text, "北京地铁8号线下行性能计算");
paragraphs.SetAlignment(0);//设置文本格式左对齐
font=selection.GetFont();//Font的声明对象font.SetBold(true);//设置字体为粗体font.SetSize(16);//设置文字大小selection.SetFont(font);//应用格式
接下来的正文部分主要包括列车线路、运营路线、列车编组、车辆自重等,与上述方法基本相同,只需改变相应的参数即可。
本文采用先将运行图保存为本地位图文件,然后再将本地位图文件插入到文档报告指定位置中的方法,实现了图形的插入。
2.2.1 保存为本地位图文件(.bmp)
位图文件由4个部分组成,分别是:文件头、信息头、色彩表和像素阵列,要将一个屏幕图形保存为位图文件,首先要获得它的如上信息,这一过程称为位图的“捕获”,实质上就是在内存中创建屏幕图像的一个副本。在这之前需要先获得内存的设备环境DC,然后把所有图形内容复制过来,从而实现位图的捕获。接下来将位图的信息写入,按照BMP文件格式要求将内存位图保存为本地位图文件。关键代码如下:
CDC MemoryDC;//定义内存DC
CBitmap bitmap;//定义位图对象
MemoryDC.CreateCompatibleDC(pDC);//创建与屏幕DC相兼容的内存DC
bitmap.CreateCompatibleBitmap(pDC,bmpWi dth,bmpHeight);//创建兼容的内存位图
MemoryDC.SelectObject(&bitmap);//将新建位图选入内存DC
MemoryDC.BitBlt(O,O,bmpWidth,bmpHidth,pDC,lUPOint.x,lUPOint.y,
SRCCOPY);//复制位图
2.2.2 插入本地位图文件
有了本地位图文件,只需创建一个嵌入式图片对象,将其插入到报告中指定位置即可。这里需要用到的类对象为Inlineshapes,关键代码如下:
CnlineShapes simbmp;//创建一个嵌入式图片对象
simbmp.AddPicture(pic,&LinkToFile,&Save WithDocument, &RangT); //加载图片到文档中。
2.2.3 图形设置为横向
通常城轨列车模拟运行图都是横向显示,而默认的Word页面设置为纵向,因此要将页面设置为横向。此处要用到的类对象为CpageSetup、Csections和Cscetion,通过分节符控制页面方向,关键代码如下:
CPageSetup PS;//定义对象进行页面设置
CSections sections;
CSection section;
COleVariant wdSectionBreak(short(2));
sel.InsertBreak(wdSectionBreak);//分节符,控制页面方向
sections = sel.get_Sections();
section =sections.get_Last();
PS=section.get_PageSetup();
PS.put_Orientation(1);//设置1为横向,为纵向
城轨列车模拟运行报告中通常使用表格显示站间信息,包括发到站名称、站间距离、运行时间等。这些信息都是从数据库中取得的,每次选择的站点不同,相应的信息也随之变化。
首先插入一个新的空表格,通过调用Word类对象设置这个表格的基本属性,包括行数、列数等。
para = paras.Item();//获取表格所在段落
range = para.get_Range();
CTable0 tab = tabs.Add(range, row, col, &Ne wTemplate,&DocumentType);
添加完空表格之后,就可以从数据库中读取数填充表格了。填充表格需要用到的类对象是Cell和Range,关键代码如下:
CCell cell;//创建Cell对象
CRange range;
cell = ptable->Cell(1, i);//获取表格行第 i格
range = cell.get_Range();
range.InsertAfter(); //填写该列的名称
有的列车运行报告中还有可能要求表格中的单元格合并,关键代码如下:
CCells cells;
cell=tab.cell(2,1);//合并第1列中的第2行和第3行
cell.Merge(tab.cell(3,1));
至此,就完成了城轨列车模拟运行报告的自动生成,最后通过程序自动保存文档即可。在编程过程中有3点需要注意:
(1)表格一定要在文字和图片都插入完毕后才能插入,否则会引起排版混乱,在插入文字和图片的同时要预留出插入表格的段落。
(2)在页面横向或纵向设置发生变化时,要注意段落的变化,否则也会引起排版混乱。
(3)由于表格的插入,每一个单元格都是一段,所以原来的段落N会变为第(N+行数*(列数+1)-1)段。
通过在Visual C++6.0和Office 2003、2007环境下运行软件,自动生成了城轨列车模拟运行报告,且文字、图片、表格排版正常,存储路径正常,界面如图1所示。
图1 城轨列车模拟运行报告界面图
本文介绍了在Visual c++环境中调用Word自动生成城轨列车模拟运行报告的实现方法,在实际应用中可以极大地提高工作效率。
[1]张 南,李玉山.用vc控制word生成仿真报告[J]. 电脑编程技巧与维护,2011(7).
[2]黄智敏,孙建雄,李建羽.城规列车运行仿真算法研究[J].电力机车与城轨车辆,2007,30 (3).
[3]姜照林.用vc实现word文档自动化[J].嘉兴学院学报,2007,19(3).