劉磊
(連云港電子口岸信息發(fā)展有限公司 江蘇 連云港 222042)
船舶積載圖指的是標明貨物在船上具體裝載位置的示意圖,船舶航次所承運的貨物,在船上的堆裝位置和堆裝工藝的合理安排,對確保船舶安全,防止貨損貨差,充分利用船舶載貨容積,提高裝卸效率,提高船舶運輸?shù)慕?jīng)濟效益具有重要的意義。通常在船舶積載計劃確定后,即繪制出計劃積載圖,在圖上標明船舶計劃裝載的各票貨物的名稱、裝貨單號、卸貨港、包裝形式、件數(shù)、噸數(shù)、貨位等信息,由于船舶積載圖的信息量很大,且頻繁更新,人工繪制船舶積載圖的方法已經(jīng)不能適應大型船舶發(fā)展的需要。文中描述了如何應用GDI+實現(xiàn)終端用戶快速繪制船舶積載圖的方法。
1)創(chuàng)建一個datagrid,展示所有進出港船舶航次列表,雙擊選中一條記錄,即可對該船舶航次進行積載圖的繪制[1];
2)創(chuàng)建一個實現(xiàn)船舶積載圖模板的方法,選中船舶時調(diào)用該方法,首先繪制出一個基本的船舶積載圖模型;
3)創(chuàng)建“選擇”、“直線”、“矩形”、“標簽”4 個按鈕,其中“直線”、“矩形”、“標簽”用來標識當前操作是要繪制直線、矩形和文本對象,“選擇”用來標識當前是要選擇已繪制的圖形對象并對其進行修改操作[2];
4)創(chuàng)建一個datagrid,用來顯示已選擇船舶航次裝載的貨物,選中一條貨物明細,繪制標簽時自動帶入貨物品名、件重尺等信息;
5)屏幕繪制區(qū)域右鍵彈出功能菜單,“排列”實現(xiàn)已選擇圖形對象的圖層設置,“分艙”實現(xiàn)對整艘船舶的艙位劃分,“虛線、鎖線”用來設置繪制圖形對象時的線性,“保存”即對已繪制的積載圖進行保存[3]。
6)直線、矩形、文本的繪制及已繪制圖形對象的選擇和修改:創(chuàng)建一個基礎圖形類,把用戶要動態(tài)繪制的圖形都抽象成類,并定義其屬性和方法,用戶繪制圖形時實例化該類生成一個圖形對象,保存繪制圖形的屬性;創(chuàng)建8個PictureBox,分別賦予不同的顏色,當用戶選中已繪制的圖形時,在圖形的關鍵位置顯示圖片,用戶可以拖動圖片來移動或改變圖形;創(chuàng)建一個動態(tài)數(shù)組,用來保存繪制的圖形對象,在窗體的鼠標按下事件中判斷當前是要繪制新圖還是要修改圖形,并記錄當前鼠標的坐標[4],在窗體的鼠標移動事件中判斷是目前是繪制新圖形還是要選擇已繪制的圖形,如果是要修改圖形,則根據(jù)移動鼠標的坐標遍歷所有已繪制的圖形,并判斷是否有圖形被選中,選中則在圖片的關鍵位置顯示圖片,以便于改變圖形屬性;已選中圖形或者繪制新圖形,則先把新繪制或要修改的圖形軌跡用窗體背景色畫掉,再把所有窗體上的圖形都重新繪制一遍,以防止上個命令會擦除掉其他圖形的象素,然后再繪制最新的圖形,在窗體的鼠標釋放事件中對于新繪制的圖形則實例化一個圖形對象[5],用以保存新圖形的屬性,并把實例化的對象添加到動態(tài)數(shù)組中;對于修改的圖形,則直接修改圖形對象的屬性,在PictureBox的鼠標按下、移動、釋放事件中實現(xiàn)被選中圖形的修改,邏輯依然是先用背景色畫掉選中圖形的軌跡,再把所有窗體上的圖形都重新繪制一遍,以防止上個命令會擦除掉其他圖形的象素[6],然后再繪制最新的圖形。
7)圖形對象的保存及加載:在菜單的保存按鈕中實現(xiàn)繪制圖形保存到數(shù)據(jù)庫中,遍歷動態(tài)數(shù)組存儲的圖形對象,把每個圖形對象的關鍵屬性存儲到數(shù)據(jù)庫表中,直線存儲起點和端點的坐標,矩形存儲起點坐標、長度和寬度,文本存儲起點坐標、長度、寬度和文本內(nèi)容[7],加載圖形時讀數(shù)據(jù)庫表每條記錄,根據(jù)圖形對象的類型及存儲的屬性動態(tài)繪制圖形對象,并保存到動態(tài)數(shù)組中[8]。
1)創(chuàng)建datagrid,加載進出港船舶航次信息,選擇進行一個航次的積載圖繪制,主要代碼片段如下:
2)針對已選擇的船舶航次,加載已繪制的積載圖或積載圖模板,以直線為例主要代碼如下:
3)繪制直線、矩形、文本均是在鼠標的 MouseDown和MouseUp事件中完成,代碼片段:
4)對已繪制圖形的選擇及修改操作在鼠標的MouseMove事件中完成,代碼片段如下:
5)分艙的功能實在textbox的keydown事件中完成,輸入艙位數(shù),根據(jù)船型自動分艙,代碼片段如下:
通過演示程序,實現(xiàn)了在VISUAL BASIC.NET編程環(huán)境中如何應用GDI+使用戶可以自定義的動態(tài)繪制船舶積載圖,并且可以使用鼠標拖拽實現(xiàn)已繪制圖形對象的移動、縮放等功能,同時把船舶航次的裝貨清單與實體積載圖關聯(lián)起來,應用鼠標就可以實現(xiàn)裝載貨物的快捷繪制,繪制的圖形可以保存到數(shù)據(jù)庫中,也可以加載已保存圖形對象到窗體圖形。作者已把本文的實現(xiàn)方法應用到連云港中理外輪理貨信息管理系統(tǒng)中,得到了用戶的一致好評。通過本文示例,希望能增進大家對文中涉及到的相關技術的了解,為以后編程實現(xiàn)中遇到類似的需求提供實踐基礎
[1]范文慶.Windows API開發(fā)詳解[M].北京:人民郵電出版社.2011.
[2]Christian Nagel,bill Evjen,Jay Glynn等.C#高級編程[M].北京:清華大學出版社,2008.
[3]埃斯波西托.Microsoft.NET企業(yè)級應用架構(gòu)設計[M].陳黎夫,譯.北京:人民郵電出版社,2010.
[4]張紅軍,耿隨心.Visual C++6.0編程詳解[M].北京:科學出版社,2003.
[5]張海藩.軟件工程導論[M].北京:清華大學出版社,2009.
[6]王小科.C#開發(fā)實戰(zhàn)寶典[M].北京:清華大學出版社,2010.
[7]孫繼磊,劉亮亮.精通Visual C#2008——語言基礎、數(shù)據(jù)庫系統(tǒng)開發(fā)、Web開發(fā)[M].北京:人民郵電出版社,2009.
[8]楊建昌.GDI+高級編程[M].北京:清華大學出版社,2009.
[9]王小科.C#開發(fā)實戰(zhàn)寶典[M].北京:清華大學出版社,2010.
[10]王小科,梁冰,呂雙.Visual C#項目開發(fā)實例自學手冊[M].北京:人民郵電出版社,2008.
[11]赫姆瑞賈尼.Java敏捷開發(fā):使用Spring,Hibernate和Eclipse[M].韓坤,徐琦,譯.北京:人民郵電出版社,2007.
[12]Segaran T.Programming Collective Intelligence[M].O’Reilly,2009:1-145.
[13]Reeves W T.Particle systems——a technique for modeling a class offuzzy objects[J].Computer Graphics,1983,17(3):35-376.
[14]Luebke D,Reddy M,CohenJ D,et al.Level of Detail for 3D Graphics[M].USA:Morgan Kaufmann Publishers,2002.