VB中利用MapX建立使用者定製工具

2021-04-13 09:02:46 字數 4094 閱讀 9978

摘要 本文介紹了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為應用程式堆疊大...