摘要 本文介紹了vb中如何利用mapx建立使用者定製地圖工具,詳細地說明了整個建立過程,以及在建立定製工具的過程中所使用的關鍵方法。
1.前言
隨著地理資訊系統的發展,國內外已出現了不少gis(地理資訊系統)軟體,其中mapx是mapinfo公司的activex控制項產品。由於它是一種基於windows作業系統的標準控制項,因而mapx4.0支援絕大多數標準的視覺化開發環境,如:visualbasic,delphi,powerbuilder,visualc++等物件導向語言,而且可以使用lotus script將mapx4.0嵌入到lotus notes中。
雖然mapx4.0提供了許多標準工具,可以直接使用,但是很多情況下,這些標準工具不能滿足實際的需要,這就要求通過定製地圖工具來規定工具能完成何種功能,例如畫橢圓工具,標尺工具(測線段長度)等等。下面,筆者就通過一具體例項來介紹一下vb中採用mapx4.0控制項製作地圖的定製工具。
2.vb環境下mapx程式設計
利用mapx4.0建立使用者定製工具分為以下三步:
2.1 建立定製工具
本例建立的是畫橢圓工具。首先,宣稱全域性常量miaddellipsetool = 1,1就代表了畫橢圓這個工具。然後,在主窗體中建立畫橢圓工具。
關鍵方法(建立定製工具):
object.createcustomtool (toolnumber, type, cursor, [shiftcursor] , [ctrlcursor], [infotips])
object(物件):map物件;
toolnumber(工具號)是建立出代表畫橢圓工具的miaddellipsetool;
type(型別):描述了工具的行為,這個引數取的tooltypeconstants(工具型別常量)值。本例,工具是按下滑鼠左鍵到彈上滑鼠左鍵的過程中畫橢圓。本例中取的是mitooltypepoint;
cursor(指標形狀):使用該工具時,該工具在地圖上顯示的形狀,該引數從cursorconstants(指標常量)中取值。本例選用的是microsscursor,那麼當選擇該工具時,該工具將在地圖上顯示成十字叉形狀;
shiftcursor ,ctrlcursor:這兩個引數是可選的,預設情況時,shift鍵和ctrl鍵不起作用;
infotips(工具提示): boolean型。 如果要顯示工具提示,需要將此引數設為true;預設值為false。
實際編碼:
public const miaddellipsetool = 1 注釋:定製的加橢圓工具
public rectx1 as double 注釋:新加橢圓(所需的矩形)的點1的x(經緯度)座標
public recty1 as double 注釋:新加橢圓(所需的矩形)的點1的y(經緯度)座標
public rectx2 as double 注釋:新加橢圓(所需的矩形)的點2的x(經緯度)座標
public recty2 as double 注釋:新加橢圓(所需的矩形)的點2的y(經緯度)座標
private sub form_load() 注釋:建立定製工具
map1.createcustomtool miaddellipsetool, _
mitooltypepoint, microsscursor
end sub
此時所建立的工具沒有任何功能,要工具具備相應的功能由第二步實現。
2.2編寫工具控制代碼 (工具具備什麼功能)。
當按下滑鼠左鍵時,需要記下橢圓的起始位置;當滑鼠右鍵彈上時,需要記下橢圓的結束位置,這時,畫出橢圓。橢圓將以這兩點為矩形的對角線在矩形框中繪製橢圓。需要特別注意的是,mapx4.0中使用的座標系統是經/緯度系統,而mousedown,mouseup事件中的座標是螢幕座標,因此,需要將螢幕座標轉化為經/緯度座標,所畫橢圓才能顯示在正確的位置上。
關鍵方法(繪製橢圓):
object.createellipticalregion(rectangle,[angle] , [resolution] , [style] )
object:featurefactory物件;
rectangle(矩形):rectangle物件,確定了橢圓的大小;
angle(角度):變數,決定橢圓繞中心點旋轉的角度;
resolution(精度) :變數, 橢圓的精度,由多少點構成;
style(樣式): 變數,定義了所畫橢圓的樣式,如顏色,線型等。
實際編碼:
private sub map1_mousedown(button as integer, shift as integer, x as single, y as single)
if button = vbleftbutton and (map1.currenttool = miaddellipsetool) then
map1.numericcoordsys.set milonglat, 0
注釋:將螢幕座標轉變為經緯度座標
map1.convertcoord x, y, rectx1, recty1, miscreentomap
end if
end sub
private sub map1_mouseup(button as integer, shift as integer, x as single, y as single)
if button = vbleftbutton and (map1.currenttool = miaddellipsetool) then
注釋:將地圖的座標系統設為經/緯度座標
map1.numericcoordsys.set milonglat, 0
注釋:將螢幕座標轉變為經緯度座標
map1.convertcoord x, y, rectx2, recty2, miscreentomap
注釋:滑鼠彈起時,畫橢圓
call addellipse(form1,rectx1,recty1,rectx2,recty2)
endif
end sub
注釋:畫橢圓過程
public sub addellipse(frm as form, x1 as double, _
y1 as double,x2 as double,y2 as double, editlayer as variant)
dim rect as new mapxlib.rectangle 注釋:畫橢圓的矩形框
dim createdellipse as feature 注釋:所畫的橢圓
dim i as integer,editlayer as integer
注釋:設定畫橢圓的矩形框
rect.set x1, y1, x2, y2
with frm.map1
注釋:建立橢圓
set createdellipse = .featurefactory. _
createellipticalregion(rect, , 500, .defaultstyle)
for i=1 to .map1.layers.count
if .map1.layers(i).editable=true then
editlayer=i
exit for
endif
next i
注釋:將橢圓新增到所畫的圖層上
.layers.item(editlayer).addfeature createdellipse
end with
end sub
此時,畫橢圓工具具備了畫橢圓的功能,運用定製的這個工具由第三步實現。
2.3呼叫定製工具
注釋:設定當前工具為定製的畫橢圓工具
map1.currenttool=miaddellipse
或 map1.currenttool=1
3. 結束語
本例畫橢圓時,從滑鼠按下,一直到滑鼠最後彈起時才可以看到橢圓出現在地圖上,這就是說在滑鼠移動(mousemove事件)時,從滑鼠按下,到滑鼠彈起的中間過程是看不到中間過程的橢圓出現的。為了實現在滑鼠移動時,也可以看到橢圓,那麼需要在mousemove事件中畫橢圓,並且,每次畫橢圓時刪除掉前一次畫的橢圓。這樣的執行結果就是看到,從滑鼠按下,到滑鼠彈起的過程中,隨滑鼠的移動而有了繪橢圓的變化過程。
另外,本文是以vb5為例,進行的程式設計,但對於其它語言,如vc++,delphi等,程式設計思路和關鍵方法都是相同的。
VB6 動態建立使用者控制項
vb6有乙個新功能,可以動態新增控制項,不用控制項陣列 object.add progid,name,container 引數說明 object 必需的。乙個物件表示式,其值是 應用於 列表中的乙個物件。progid 必需的。乙個標識控制項的字串。大多數控制項的 progid 都可通過檢視物件瀏覽器...
Android中利用shape定製控制項邊框
在日常android的開發過程中,我們會遇到這樣的乙個需求。我只想給控制項加左邊框或者右邊框,當然方法有很多種了。下面就不列舉了,我就分享乙個我認為比較好的實現方式吧。首先要了解shape中gradient的原理,這裡就不多說了,不明白的就自己去google。分別定義左邊框 底邊框 右邊框 上邊框。...
在VB中建立多執行緒
在vb中建立執行緒用到以下幾個api函式 建立執行緒api 此api經過改造,lpthreadattributes改為any型,lpstartaddress改為傳值引用 因為函式入口位址是由形參變數傳遞,如果用傳址那將傳遞形參變數的位址而不是函式的入口位址 引數dwstacksize為應用程式堆疊大...