王永剛,錢雪軍,葉華平,姚 軍
(1.同濟大學 電氣工程系,上海 200331;2.上海軌道交通培訓中心,上海 201100)
城軌列車模擬運行報告是了解和改善列車運行性能的一個重要工具。報告涵蓋列車模擬運行的各個方面,使工程人員能夠獲得更多的列車信息以便進行列車運行的優(yōu)化。城軌列車模擬運行報告的內(nèi)容包括3個方面:(1)文字:通過程序代碼控制報告中文字的字體、顏色、大小以及對齊方式等;(2)圖形:在城軌列車模擬運行期間會產(chǎn)生大量的圖形且需要橫向顯示,這就涉及到圖形的插入存儲以及圖形的橫向設置;(3)表格:需要在報告中插入行駛數(shù)據(jù)的表格,這就涉及到表格插入、數(shù)據(jù)填充以及部分單元格合并。對城軌列車模擬運行報告自動生成進行研究,應確定報告格式,本軟件采用Word報告的形式。
自動生成城軌列車模擬運行報告要先了解如何生成文檔,Word中的每一個操作都是對其對象的操作。Word中包括很多對象,如文檔、對話框、圖表、文本框和圖形等,而Word本身也是對象。這些對象都有自己的方法和屬性。由于Word本身是一個實現(xiàn)自動化的COM組件,因此可以通過COM接口使用編程的方式來訪問這些對象,改變它們的屬性以完成對Word文檔的自動化操作及一些特殊的應用,從而最終生成運行報告。需要用到的Word對象如表1所示。
表1 Word對象
有了上述了解,通過添加Word類型庫,將表1中的全部對象添加至工程,并聲明要用到的類對象,啟動Word應用程序,新建一個空白的文檔,就可以進行城軌列車模擬運行報告自動生成的實現(xiàn)了。
在創(chuàng)建了新空白文檔后,利用Word類對象進行編程,自動化控制Word的內(nèi)容。本文以北京地鐵8號線為例,首先在Word文本的第1行,用3號字、粗體、居中顯示文本標題“北京地鐵8號線下行性能計算”。實現(xiàn)方法是用Paragraphs類設置對齊方式,用Selection類加載文字內(nèi)容,用Font類設置字體格式和大小,如:
strcpy_s(text, "北京地鐵8號線下行性能計算");
paragraphs.SetAlignment(0);//設置文本格式左對齊
font=selection.GetFont();//Font的聲明對象font.SetBold(true);//設置字體為粗體font.SetSize(16);//設置文字大小selection.SetFont(font);//應用格式
接下來的正文部分主要包括列車線路、運營路線、列車編組、車輛自重等,與上述方法基本相同,只需改變相應的參數(shù)即可。
本文采用先將運行圖保存為本地位圖文件,然后再將本地位圖文件插入到文檔報告指定位置中的方法,實現(xiàn)了圖形的插入。
2.2.1 保存為本地位圖文件(.bmp)
位圖文件由4個部分組成,分別是:文件頭、信息頭、色彩表和像素陣列,要將一個屏幕圖形保存為位圖文件,首先要獲得它的如上信息,這一過程稱為位圖的“捕獲”,實質上就是在內(nèi)存中創(chuàng)建屏幕圖像的一個副本。在這之前需要先獲得內(nèi)存的設備環(huán)境DC,然后把所有圖形內(nèi)容復制過來,從而實現(xiàn)位圖的捕獲。接下來將位圖的信息寫入,按照BMP文件格式要求將內(nèi)存位圖保存為本地位圖文件。關鍵代碼如下:
CDC MemoryDC;//定義內(nèi)存DC
CBitmap bitmap;//定義位圖對象
MemoryDC.CreateCompatibleDC(pDC);//創(chuàng)建與屏幕DC相兼容的內(nèi)存DC
bitmap.CreateCompatibleBitmap(pDC,bmpWi dth,bmpHeight);//創(chuàng)建兼容的內(nèi)存位圖
MemoryDC.SelectObject(&bitmap);//將新建位圖選入內(nèi)存DC
MemoryDC.BitBlt(O,O,bmpWidth,bmpHidth,pDC,lUPOint.x,lUPOint.y,
SRCCOPY);//復制位圖
2.2.2 插入本地位圖文件
有了本地位圖文件,只需創(chuàng)建一個嵌入式圖片對象,將其插入到報告中指定位置即可。這里需要用到的類對象為Inlineshapes,關鍵代碼如下:
CnlineShapes simbmp;//創(chuàng)建一個嵌入式圖片對象
simbmp.AddPicture(pic,&LinkToFile,&Save WithDocument, &RangT); //加載圖片到文檔中。
2.2.3 圖形設置為橫向
通常城軌列車模擬運行圖都是橫向顯示,而默認的Word頁面設置為縱向,因此要將頁面設置為橫向。此處要用到的類對象為CpageSetup、Csections和Cscetion,通過分節(jié)符控制頁面方向,關鍵代碼如下:
CPageSetup PS;//定義對象進行頁面設置
CSections sections;
CSection section;
COleVariant wdSectionBreak(short(2));
sel.InsertBreak(wdSectionBreak);//分節(jié)符,控制頁面方向
sections = sel.get_Sections();
section =sections.get_Last();
PS=section.get_PageSetup();
PS.put_Orientation(1);//設置1為橫向,為縱向
城軌列車模擬運行報告中通常使用表格顯示站間信息,包括發(fā)到站名稱、站間距離、運行時間等。這些信息都是從數(shù)據(jù)庫中取得的,每次選擇的站點不同,相應的信息也隨之變化。
首先插入一個新的空表格,通過調用Word類對象設置這個表格的基本屬性,包括行數(shù)、列數(shù)等。
para = paras.Item();//獲取表格所在段落
range = para.get_Range();
CTable0 tab = tabs.Add(range, row, col, &Ne wTemplate,&DocumentType);
添加完空表格之后,就可以從數(shù)據(jù)庫中讀取數(shù)填充表格了。填充表格需要用到的類對象是Cell和Range,關鍵代碼如下:
CCell cell;//創(chuàng)建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)在頁面橫向或縱向設置發(fā)生變化時,要注意段落的變化,否則也會引起排版混亂。
(3)由于表格的插入,每一個單元格都是一段,所以原來的段落N會變?yōu)榈冢∟+行數(shù)*(列數(shù)+1)-1)段。
通過在Visual C++6.0和Office 2003、2007環(huán)境下運行軟件,自動生成了城軌列車模擬運行報告,且文字、圖片、表格排版正常,存儲路徑正常,界面如圖1所示。
圖1 城軌列車模擬運行報告界面圖
本文介紹了在Visual c++環(huán)境中調用Word自動生成城軌列車模擬運行報告的實現(xiàn)方法,在實際應用中可以極大地提高工作效率。
[1]張 南,李玉山.用vc控制word生成仿真報告[J]. 電腦編程技巧與維護,2011(7).
[2]黃智敏,孫建雄,李建羽.城規(guī)列車運行仿真算法研究[J].電力機車與城軌車輛,2007,30 (3).
[3]姜照林.用vc實現(xiàn)word文檔自動化[J].嘉興學院學報,2007,19(3).