当前位置:甜馍馍地理信息网 >> 地理信息系统GIS >> 组件式GIS >> 正文 >>  [阅读资讯:如何在MapObject下把ActiveX控件作为客户端开发]

如何在MapObject下把ActiveX控件作为客户端开发

[ 来源:互联网 | 时间:2007年10月20日 | 收藏本文 ] 【

ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在有目录和其它支持的网络中,COM变成了分布式COM(DCOM)。在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(现在的网络主要包括Windows和Mac)中任意运行的程序。这个组件就是ActiveX近控件。ActiveX是Microsoft为抗衡Sun Microsystems的JAVA技术而提出的,此控件的功能和JAVA applet功能类似。

如果您使用的是Windows操作系统,您或许会注意到一些以OCX结尾的文件。OCX代表“对象链接与嵌入控件”(OLE),这个技术是Microsoft提出的程序技术,用于处理桌面文件的混合使用。现在COM的概念已经取代OLE的一部分,Microsoft也使用ActiveX控件代表组件对象。

组件的一大优点就是可以被大多数应用程序再使用(这些应用程序称为组件容器)。一个COM组件(ActiveX控件)可由不同语言的开发工具开发,包括C++和Visual Basic或PowerBuilder,甚至一些技术性语言如VBscript。

目前,ActiveX控件在Windows 95/NT和Macintosh中运行,Microsoft还准备支持UNIX的ActiveX控件。

在进行地理信息系统开发时,经常需要对图形进行浏览、查询、放大等一些基本操作,在C/S模式下采用MO或MapX组件式开发都极易实现;在B/S架构模式下往往却不知道从何入手,一般的做法是采用ArcIMS或MapXtreme进行开发,但难度较大;后来在网上浏览贴子时,读到一篇《MO作为B/S客户端控件的开发》时,便意识到将Mo封装成ActiveX控件再嵌入到网页中应该也是可行的,便试着做了一下。

本文结合这样一个开发实例来阐述一下基于VB平台下的ActiveX控件作为客户端的具体开发与应用,其具体步骤如下:

一、确定控件将要提供的功能:

要实现的功能比较简单,主要如下:
1、  地图的放大、缩小、全图、左移、右移、上移和下移。
2、  根据不同比例加载不同分辨率的影像图;
3、  加载图层;
4、  加载注记层;

二、设计控件的外观:

工具栏(toolbar1 ) ImageList1       map   ScaleBar1

三、设计控件的接口,即属性、事件和方法;

1.加载图层(方法)
public sub LoadMap(strTable As String)
       ……
End sub

 2、加载注记层(方法)
 Public Function LoadLabelRender(strTable As String, strLabelRender As String)
            ……
 End Function

3、属性:
Server(服务器)  DataBase(SDE数据库名)  User(用户) Password(密码)StrFolder(影像图路径)

四、创建由控件工程和测试工程组成的工程组:

1、  将用户控件命名为ImageMap.ctl ,将工程名保存为“ImageMap.vbp”

2、  新建测试ActiveX控件的工程,将测试工程的窗体保存为Form1.frm,将测试工程保存为“工程1.vbp”。

3、  从“文件”菜单中点击“添加工程”,从“现存”中加载用户控件工程“ImageMap.vbp”将工程组保存为“组1.vbg”

4、  将工程组“组1.vbg”中的测试工程“工程1.vbp” 设置为启动。

五、通过把代码添加到UserControl对象来实现控件的外观:

1、  控件初始化:

'用户控件初始化

Private Sub UserControl_Initialize()

    m_Server = "SDE81:Server"

    m_DataBase = "SDE"

    m_User = "sa"

    m_Password = "sa"

    m_AppName = "地图"

    m_strFolder = ""

End Sub

2、  控件重绘时:

'重新绘制用户控件

Private Sub UserControl_Resize()

    ImageMap.Left = 10

    ImageMap.Top = Toolbar1.Height + 10

    ImageMap.Width = UserControl.Width - 20

    ImageMap.Height = UserControl.Height - Toolbar1.Height - 20

End Sub

3、  读取控件属性:

'读取控件的属性设置

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)

    Me.Server = PropBag.ReadProperty("Server", Me.Server)

    Me.DataBase = PropBag.ReadProperty("DataBase", Me.DataBase)

    Me.User = PropBag.ReadProperty("User", Me.User)

    Me.Password = PropBag.ReadProperty("Password", Me.Password)

    Me.AppName = PropBag.ReadProperty("AppName", Me.AppName)

    Me.StrFolder = PropBag.ReadProperty("StrFolder", Me.StrFolder)

End Sub

4、  写控件属性:

'向用户控件写属性

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)

    Call PropBag.WriteProperty("Server", Me.Server, "Server")

    Call PropBag.WriteProperty("DataBase", Me.DataBase, "esri_sde")

    Call PropBag.WriteProperty("User", Me.User, "sa")

    Call PropBag.WriteProperty("Password", Me.Password, "sa")

    Call PropBag.WriteProperty("AppName", Me.AppName, "地图")

    Call PropBag.WriteProperty("StrFolder", Me.StrFolder, "")

End Sub

六、实现控件的接口和功能:

1.  对外接口:加载注记层(参数1  SDE数据表  参数2   标注字段)

Public Function LoadLabelRender(strTable As String, strLabelRender As String)

    Dim SDEConn As New MapObjects2.DataConnection
    Dim gs As New MapObjects2.GeoDataset
    Dim lyr As New MapObjects2.MapLayer

    Dim lblrenderer As New MapObjects2.LabelRenderer
    SDEConn.Server = Me.Server
    SDEConn.DataBase = "instance=esri_sde;database=" & Me.DataBase
    SDEConn.User = Me.User
    SDEConn.Password = Me.Password

    If SDEConn.Connect Then
        Set gs = SDEConn.FindGeoDataset("sde.sde." & strTable & ".shape.polygons")
        Set lyr.GeoDataset = gs
        lblrenderer.Field = strLabelRender
        lblrenderer.DrawBackground = False
        lblrenderer.SplinedText = True
        lblrenderer.Symbol(0).Font.Size = 8
        lblrenderer.Symbol(0).Color = moBlue

        Set lyr.Renderer = lblrenderer
        lyr.Visible = False
        lyr.Name = "注记" & strTable
        ImageMap.Layers.Add lyr
        ImageMap.Refresh
    Else
        MsgBox "数据库连接错误!", vbInformation, "提示"
    End If
    Set SDEConn = Nothing
    Set gs = Nothing
    Set lyr = Nothing
End Function

2、对外接口:加载地图(参数   数据表)

Public Sub LoadMap(strTable As String)

    Dim SDEConn As New MapObjects2.DataConnection
    Dim gs As New MapObjects2.GeoDataset
    Dim lyr As New MapObjects2.MapLayer   

    SDEConn.Server = Me.Server
    SDEConn.DataBase = "instance=esri_sde;database=" & Me.DataBase
    SDEConn.User = Me.User
    SDEConn.Password = Me.Password   

    If SDEConn.Connect Then
        UserControl.MousePointer = vbDefault
        Set gs = SDEConn.FindGeoDataset("sde.sde." & strTable & ".shape.polygons")
        Set lyr.GeoDataset = gs
        lyr.Name = strTable
        lyr.Symbol.Outline = True
        lyr.Symbol.OutlineColor = moRed
        lyr.Symbol.Size = 1
        lyr.Symbol.Style = moTransparentFill
        ImageMap.Extent = lyr.Extent
        ImageMap.Layers.Add lyr
        AddImageCatalog ImageMap, GetMapBL, Me.StrFolder
    Else
        MsgBox "数据库连接错误!", vbInformation, "提示"
    End If
    Set SDEConn = Nothing
    Set gs = Nothing
    Set lyr = Nothing
End Sub

 3、属性的设置:(Server   DataBase  User   Password  StrFolder)

4、其它功能比如得到当前地图比例、加载影像图、检测影像图文件夹路径是否存在……

七、编译控件部件(.Ocx文件),生成MapImage.ocx控件

八、将编译好的ActiveX控件嵌入到网页当中:

1、LoadMap.htm页面代码如下:

<HTML>

       <HEAD>

              <title>地图查询</title>

              <meta http-equiv="Content-Language" content="zh-cn">

              <meta http-equiv="Content-Type" content="text/html; charset=gb2312">

              <meta content="C#" name="CODE_LANGUAGE">

              <meta content="Javascript" name="vs_defaultClientscript">

              <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">

              <script language="javascript" src="MapView.js" type="text/javascript"></script>           

       </HEAD>

       <body onload="LoadMap()">

              <OBJECT id="map1" classid="clsid:FB1A4DCA-6B73-45C7-9C48-C24CCD24C7EF" width="800" height="600">

                            <PARAM NAME="_ExtentX" value="16510">

                            <PARAM NAME="_ExtentY" value="13758">

                            <PARAM NAME="Server" value="">

                            <PARAM NAME="DataBase" value="">

                            <PARAM NAME="User" value="">

                            <PARAM NAME="Password" value="">

                            <PARAM NAME="AppName" value="">

                            <PARAM NAME="StrFolder" value="\\echo\echo\影像图">

              </OBJECT>   

       </script>

       </body>

</HTML>

2、MapView.js页面代码如下:

function LoadMap()
       {
       try
      {

              window.status = "准备加载图形. . .";

              //disPlayLoading();

              var mapViewer  = document.getElementById('map1') ;

              //设置连接参数

              mapViewer.Server = "sde81:echo";

              mapViewer.Database = "sde";

              mapViewer.User = "sa"; 

              //mapViewer.StrFolder="\\echo\echo\影像图";

              mapViewer.Password = "sa";       

              window.status = "正在加载图形!请稍候. . .";        

              //加载

              //mapViewer.LoadMap("XZQ#3");

              mapViewer.LoadMap("ZD#1");

              mapViewer.LoadLabelRender("ZD#1","TDZL");

              //disPlayMapViewer()

              window.status = "加载地图完成";           

       }

       catch(e)

       {  
              alert("加载地图出现问题!错误信息:"+e.message) ;                            

              window.status = "加载地图失败";
       }

}

九、 调试运行:

1、  注册编译好的ActiveX控件:regsvr32 控件路径 & 控件名

2、  设置浏览器的安全模式:将ActiveX控件设为可用

具体操作:右键点击桌面上的浏览器图标,在活动菜单中选择“属性”项,在弹出的属性窗体中选择“安全”项页,设置“Internet”和“本地Intranet”安全设置。

3、浏览网页,在浏览器地址栏中输入:http://localhost/Loadmap.htm  得到的显示页面如下:

如何在MapObject下把ActiveX控件作为客户端开发

结尾:到此,ActiveX控件作为客户端的开发基本上已经完成,不过我们需要注意的是:虽然使用ActiveX控件可快速实现小型的组件重用、代码共享,从而提高编程效率,降低开发成本。但是ActiveX控件对于最终用户并不能直接使用,因为ActiveX控件必须先在Windows中注册。[注册ActiveX控件一般有三种方法(1、使用Regsvr32.exe程序;使用安装程序制作软件:InstallShield;3、在应用程序中 加入注册代码),具体怎样操作大家可以到网上去搜索] 由于时间仓促,许多不足之处尚请指出,谢谢!

【推荐本文】 【打印本页】 【返回顶部
最新文章
推荐文章