摘要:該文主要討論了COM技術(shù)的基本原理及其在交互圖形設(shè)計(jì)系統(tǒng)中的應(yīng)用,提出了一種以COM技術(shù)為基礎(chǔ)的基于交互技術(shù)的圖形單元組件的模型,并在開發(fā)中具體實(shí)現(xiàn)了該模型。
關(guān)鍵詞:COM;組件;接口;交互式圖形設(shè)計(jì)
Application of the Component Technique in Interactive Graph Design System
PENG Yong-kang, ZHAN Yi-lai, TIAN yuan
(Jingdezhen Ceramic Institute, Jingdezhen 333001, China)
Abstract: The main topic discussed in this article is the COM’sbasic theory and the COM’s application in the alternative graphics pattern System. A model about the graphic cell component which based on COM was analyzed and applied in the software development.
Key words: COM; component; interface; interactive graph design
在基于交互技術(shù)的圖形圖案設(shè)計(jì)系統(tǒng)開發(fā)過程中,系統(tǒng)開發(fā)人員除需考慮系統(tǒng)的構(gòu)成以及系統(tǒng)總體功能等因素外,如何讓系統(tǒng)具有良好的交互環(huán)境,提供簡單有效的交互操作方式,設(shè)計(jì)結(jié)果的“所見即所得”等問題的處理將影響到整個(gè)系統(tǒng)的設(shè)計(jì)開發(fā)過程。
在現(xiàn)代軟件開發(fā)與應(yīng)用過程中,軟件系統(tǒng)的功能已經(jīng)日益緊密的與軟件系統(tǒng)的操作方式結(jié)合,相輔相成,一個(gè)具有強(qiáng)大功能的軟件系統(tǒng),還應(yīng)具有一個(gè)簡單有效的操作界面。
組件對象模型(COM)技術(shù)的出現(xiàn),為軟件的開發(fā)工作帶來一場革命。COM技術(shù)提供了一種代碼重用的可行方法:將一組相關(guān)的代碼用COM技術(shù)進(jìn)行封裝,形成組件,即可通過接口進(jìn)行調(diào)用,同時(shí),COM技術(shù)開發(fā)的組件還是環(huán)境無關(guān)的,組件一經(jīng)生成,即可在不同的開發(fā)環(huán)境應(yīng)用。將COM技術(shù)應(yīng)用于圖形圖象處理應(yīng)用開發(fā),除了可降低系統(tǒng)開發(fā)的復(fù)雜程度,同時(shí)還具有系統(tǒng)易于升級等優(yōu)點(diǎn)。
在進(jìn)行交互式圖形圖案設(shè)計(jì)系統(tǒng)的設(shè)計(jì)與開發(fā)過程中,我們將COM技術(shù)引入系統(tǒng)的功能設(shè)計(jì)與交互界面設(shè)計(jì)環(huán)節(jié),在已經(jīng)分析出圖形圖案的基本單元的基礎(chǔ)上,將圖形圖案的基本單元的數(shù)據(jù)、數(shù)據(jù)操作方法、基本圖形單元的顯示等功能通過COM技術(shù)集成于COM組件內(nèi),用VB開發(fā)實(shí)現(xiàn)了具有交互能力的COM圖元,通過不同的COM圖元的聚合,即可實(shí)現(xiàn)圖形圖案的交互設(shè)計(jì)。
1 組件技術(shù)
組件對象模型(COM),是一種以組件為發(fā)布單元的對象模型,這種模型使各軟件組件可以用一種統(tǒng)一的方式進(jìn)行交互,具有相同的接口。COM既提供了組件之間進(jìn)行交互的規(guī)范,也提供了實(shí)現(xiàn)交互的環(huán)境。它具有與平臺無關(guān)、面向?qū)ο蟮忍攸c(diǎn)。
由圖1COM組件、COM對象、COM接口之間的關(guān)系可知,COM接口是COM對象與系統(tǒng)之間的交互通道,系統(tǒng)通過組件提供的相關(guān)接口來操作組件。
2 原理及模型
具備交互能力的COM組件(以后簡稱UI組件集)共有兩類:線條組件和平面區(qū)域組件,兩類組件均在其內(nèi)部集中實(shí)現(xiàn)了圖形單元組件的數(shù)據(jù)存取、顯示、編輯等功能。在以具備交互能力的COM組件為基礎(chǔ)設(shè)計(jì)開發(fā)的圖形圖案設(shè)計(jì)系統(tǒng)內(nèi),我們只需根據(jù)所選功能創(chuàng)建相應(yīng)組件的實(shí)例化對象,拾取并編輯有關(guān)圖元的外觀等屬性,即可完成有關(guān)圖案的設(shè)計(jì);在系統(tǒng)的設(shè)計(jì)開發(fā)過程中,由于組件自身提供了圖元初始化、圖元顯示以及圖元的拾取編輯等能力,將系統(tǒng)中的圖元拾取判斷,圖元幾何變換,圖元狀態(tài)變遷等復(fù)雜的工作簡化為向組件傳遞組件進(jìn)行相關(guān)操作所需的各種數(shù)據(jù)、事件、操作類型等工作,簡化了系統(tǒng)主控程序的設(shè)計(jì)復(fù)雜性,降低了系統(tǒng)的設(shè)計(jì)難度。
在圖形圖案設(shè)計(jì)系統(tǒng)中所有的UI組件中均實(shí)現(xiàn)了IOutTable接口,并將所有的系統(tǒng)與UI組件、UI組件與LayerSvr組件的調(diào)用以及數(shù)據(jù)通信操作均集成于該接口內(nèi),這樣在圖形圖案系統(tǒng)內(nèi),只需在創(chuàng)建具體的圖元對象時(shí)需區(qū)別具體使用的組件,以利于圖元組件的實(shí)例化外,在系統(tǒng)的編輯、顯示等操作過程中,完全無需考慮圖元組件的類型,統(tǒng)一經(jīng)由IopTable接口實(shí)現(xiàn)對圖元的編輯與顯示功能。
基于COM組件的特點(diǎn),設(shè)計(jì)開發(fā)了一個(gè)用于內(nèi)存中按圖層格式組織系統(tǒng)實(shí)時(shí)設(shè)計(jì)數(shù)據(jù)的COM組件—LayerSvr組件,并在該組件中實(shí)現(xiàn)了ILayer、IBufFile、ICObject三個(gè)接口,分別實(shí)現(xiàn)圖案實(shí)時(shí)數(shù)據(jù)的分層管理、內(nèi)存實(shí)時(shí)數(shù)據(jù)與外部文件的存取、組件內(nèi)數(shù)據(jù)與內(nèi)存實(shí)時(shí)記錄之間的數(shù)據(jù)與操作(刪除、反刪除)等功能。
圖2所示的LineCtl、ArcCtl、CircleCtl、RectangleCtl、PolyLineCtl、PolygonCtl、SplineCtl、Time3SplineCtl等UI組件均實(shí)現(xiàn)了相同的調(diào)用接口IoutTable;上述組件具有相同的的調(diào)用與處理邏輯。
在整個(gè)系統(tǒng)的組件構(gòu)成示意圖中,selNode組件處于整個(gè)UI組件的底層位置,提供一個(gè)用于直線、矩形、圓、圓弧、多線、多邊形、三次樣條曲線、貝賽爾曲線等UI組件中存儲相關(guān)點(diǎn)坐標(biāo)信息的COM組件,同時(shí)該組件提供了點(diǎn)的基本交互功能,如點(diǎn)的拾取、移動(dòng)及點(diǎn)的顯示等。
Coordinations組件提供不同規(guī)格的坐標(biāo)系,以便在系統(tǒng)中應(yīng)用不同的坐標(biāo)來設(shè)計(jì)圖案,并提供諸如平移、旋轉(zhuǎn)、縮放、錯(cuò)切等圖元幾何變換功能。
3 接口描述
3.1 IoutTable接口
在各不同功能的UI組件中,為系統(tǒng)調(diào)用、編輯及存儲數(shù)據(jù)的需要,在所有組件中均設(shè)計(jì)實(shí)現(xiàn)了下圖所示的調(diào)用接口(IOutTable),確保了系統(tǒng)UI組件調(diào)用統(tǒng)一性,在程序?qū)崿F(xiàn)時(shí)只需根據(jù)IoutTable接口提供的方法編程調(diào)用相應(yīng)的UI組件,即可實(shí)現(xiàn)系統(tǒng)的各項(xiàng)功能。
接口屬性與方法說明:
Canvas:畫布,組件顯示的媒介;
Public Sub Init() :對組件的點(diǎn)(selNode)及其它數(shù)據(jù)進(jìn)行初始化;
Public Function Save(FileBuf As Object) As Long:將組件數(shù)據(jù)存放在FileBuf組件中;
Public Property Get Canvas() As Object:獲取畫布指針;
Public Property Set Canvas(mVar As Object) :設(shè)置畫布指針;
Public Function IsHot(ByVal nx As Single, ByVal ny As Single) As Long:檢測鼠標(biāo)當(dāng)前位置是否處于選定位置,當(dāng)處于組件坐標(biāo)點(diǎn)上時(shí),返回點(diǎn)的位置,表明可改變組件相關(guān)點(diǎn)的坐標(biāo);若處于組件的其它位置但又處于組件可選擇的區(qū)域時(shí),返回常量WHOLE,表明若此時(shí)按下鼠標(biāo)左鍵并移動(dòng)鼠標(biāo),則可拖動(dòng)組件;
Public Function DrawTo(ByVal nx As Single, ByVal ny As Single) As Boolean:添加或修改組件的相關(guān)坐標(biāo)數(shù)據(jù);
Public Function RectSelect(ByVal OrgX As Single, ByVal OrgY As Single, _
ByVal Extx As Single, ByVal Exty As Single) As Boolean:判別在由函數(shù)所帶參數(shù)確定的矩形中是否包括當(dāng)前組件;
Public Sub BindingNode():顯示組件中點(diǎn)的跟蹤矩形,表明組件進(jìn)行編輯狀態(tài);
Private Sub HideNode():隱藏組件點(diǎn)的跟蹤矩形;
Public Sub Refresh():重新繪繪制當(dāng)前組件;
Public Sub Move(ByVal nx As Single, ByVal ny As Single):當(dāng)前組件在當(dāng)前位置的基礎(chǔ)上,x方向移動(dòng)nx,y方向移動(dòng)ny;
Public Sub Zoom(ByVal nx As Single, ByVal ny As Single):縮放組件,nx、ny為x方向、y方向的縮放倍數(shù);
Public Function GetData() As Single():獲取組件數(shù)據(jù);
Public Function Add(rdParm() As Single) As Boolean :以rdParam中的數(shù)據(jù)設(shè)置組件;
3.2 IBufFile接口
IbufFile接口主要實(shí)現(xiàn)對整個(gè)圖案操作的各項(xiàng)功能,具備圖案的導(dǎo)入、創(chuàng)建、移除、圖案顯示范圍設(shè)定、視區(qū)坐標(biāo)與世界坐標(biāo)設(shè)定等能力。
接口方法描述:
Public Function LoadPattern(lpFileNameStr as string)as Boolean;從外部存儲介質(zhì)加載圖案文件
Public Function SaveToFile(lpFileNameStr as Variant,Optional ByVal sFlag as Variant)as Boolean;圖案存盤
Public Function Remove(optional lpFileNameStr as Variant, Optional ByVal sFlag as Variant)as Boolean;移除圖案
Public Function NewFile(optional lpFileNameStr as Variant) as Boolean;新建圖案
Public Function SetViewArea(ByVal OrgX as long,ByVal OrgY as long,
ByVal ExtX as long, ByVal ExtY as long)設(shè)置圖案設(shè)備坐標(biāo)系統(tǒng)
Public Function LayerSum() as long;獲得當(dāng)前圖案的圖層總數(shù)
Public Function Records() as long;獲得當(dāng)前圖案的圖元記錄數(shù)
Public Function FileSum() as long;系統(tǒng)正在編輯的圖案數(shù)
Public Function SetCoord(ByVal OrgX as Single,ByVal OrgY as Single,
ByVal ExtX as Single, ByVal ExtY as Single);設(shè)置視圖坐標(biāo)
Public Function SetWCoord(ByVal OrgX as Single,ByVal OrgY as Single,
ByVal ExtX as Single, ByVal ExtY as Single);設(shè)置世界坐標(biāo)
Public Function RefreshAll() ;徹底重繪當(dāng)前圖案
Public Function Refresh() ;重新繪制當(dāng)前圖案
Public Function SetDeviceCaps(ByVal mVar as Long)
3.3 Ilayer接口
Ilayer接口在LayerFile組件中予以實(shí)現(xiàn),系統(tǒng)可以根據(jù)用戶具體需要?jiǎng)討B(tài)創(chuàng)建與銷毀圖層,并可通過該接口提供的相關(guān)方法,實(shí)現(xiàn)圖層屬性編輯、圖層整體幾何變換(平移、縮放等)操作,增加了系統(tǒng)進(jìn)行圖案設(shè)計(jì)的靈活性。
3.4 ICObject
ICObject接口提供了一個(gè)UI組件操作LayerFile組件中緩存的圖元數(shù)據(jù)的通道,通過該接口在系統(tǒng)內(nèi)實(shí)現(xiàn)了UI組件與LayerFile組件內(nèi)的圖元數(shù)據(jù)間交互操作的能力。
4 組件實(shí)現(xiàn)
組件實(shí)現(xiàn)是以具體的編程程語言將組件的各項(xiàng)功能以及組件提供的接口加以實(shí)現(xiàn),并應(yīng)用于編程實(shí)踐過程。
在此以直線圖元的拾取判別(IsHot)算法為例,分析組件及其接口操作方法的實(shí)現(xiàn)方式,并給出相應(yīng)示范代碼。
直線圖元拾取判別(IsHot)算法可以描述如圖4所示。
將上述八個(gè)組件集中到一個(gè)VB ActiveXDLL工程中,完成編碼并進(jìn)行編譯即可生成一個(gè)包含相關(guān)COM組件的動(dòng)態(tài)庫。現(xiàn)以LineCtl組件的有關(guān)接口方法的實(shí)現(xiàn)為例,說明組件的具體實(shí)現(xiàn):
Private mNode(0 To 1) As New selNode
Private CurFocus As Long
Private mOldMouse As Long
Private mMoveOrg As MoveOrg
Private mITrans As Coordinations
'------------------------------------------------------------------
Public Function IsHot(ByVal nx As Single, ByVal ny As Single) As Long
Dim i As Long
Dim y As Single, s(1) As Single, ss(1) As Single
Dim K1, k2, k3, k4, k5
IsHot = Nul
For i = 0 To 1
With mNode(i)
If .GetFocus(nx, ny) Then
IsHot = i: CurFocus = i‘選取直線圖元端點(diǎn)
Exit Function
End If
End With
Next i
K1 = mNode(1).y - mNode(0).y
k2 = mNode(1).x - mNode(0).x
k3 = mNode(0).y
k4 = mNode(0).x
If k2 = 0 Then Exit Function
y = (K1 / k2) * (nx - k4) + k3
k5 = Abs(y - ny) ‘求鼠標(biāo)點(diǎn)(nx,ny)到直線圖元的距離dist
s(0) = SELED / 15: s(1) = 0
ss(0) = 0: ss(1) = 0
Call ITrans.ViewToWorld(s(), ss(), 2) ‘對dist進(jìn)行設(shè)備坐標(biāo)到世界坐標(biāo)轉(zhuǎn)換
If k5 < s(0) Then
With mMoveOrg
.x = nx
.y = ny
.OK = True
End With
IsHot = WHOLE 'return Whole Object 整體選中
CurFocus = WHOLE
Canvas.MousePointer = vbSizePointer
Else
Canvas.MousePointer = mOldMouse
IsHot = Nul
End If
End Function
5 組件運(yùn)行結(jié)果
上述組件應(yīng)用于軟件中進(jìn)行應(yīng)用的有關(guān)結(jié)果見圖5。
6 小結(jié)
將COM技術(shù)應(yīng)用于計(jì)算機(jī)圖形圖象處理中,既可將系統(tǒng)設(shè)計(jì)開發(fā)的復(fù)雜性降到最低,提高了各組成部件的獨(dú)立性,使系統(tǒng)功能的二次增強(qiáng)以及系統(tǒng)的升級的靈活性都有大幅度的提高。使用COM技術(shù)于圖形圖象處理,可增強(qiáng)系統(tǒng)的交互性能與系統(tǒng)設(shè)計(jì)開發(fā)與升級的靈活性,對開發(fā)一個(gè)易于操作,易于維護(hù),功能強(qiáng)勁的應(yīng)用軟件,將有極大的幫助。
參考文獻(xiàn):
[1] 潘愛民.COM原理與應(yīng)用[M].北京:清華大學(xué)出版社,2000.
[2] Petzold C.北京博彥科技發(fā)展有限公司譯.Windows程序設(shè)計(jì)[M].北京:北京大學(xué)出版社,1999.
[3] Armstrong T,Patton R.ATL開發(fā)指南[M].董梁,譯.2版.北京:電子工業(yè)出版社,2000.
[4] Mckinney B.希望圖書創(chuàng)作室譯.Hardcore Visual Basic 5.0核心技術(shù)[M].北京:北京希望電腦公司,1998.
[5] 孫家廣,楊長貴.計(jì)算機(jī)圖形學(xué)[M].北京:清華大學(xué)出版社,1998.