zoukankan      html  css  js  c++  java
  • ActiveX控件作为客户端的开发

    ActiveX控件作为客户端的开发

    在进行地理信息系统开发时,经常需要对图形进行浏览、查询、放大等一些基本操作,在C/S模式下采用MOMapX组件式开发都极易实现;在B/S架构模式下往往却不知道从何入手,一般的做法是采用ArcIMSMapXtreme进行开发,但难度较大;后来在网上浏览贴子时,读到一篇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(服务器)  DataBaseSDE数据库名)  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控件嵌入到网页当中:

    1LoadMap.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>

    2MapView.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  得到的显示页面如下: 

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

     

  • 相关阅读:
    树莓派的入网方式和远程连接
    数据结构与算法之递归(C++)
    c++中字符串输入注意的问题
    基于视觉的机械臂分拣(二)
    基于视觉的机械臂分拣(一)
    数据结构与算法之折半查找(C++)
    数据结构与算法之顺序查找(C++)
    ROS之USB摄像头识别二维码问题解决
    机械臂开发之正运动学
    利用vs pcl库将多个PCD文件合并成一张PCD地图
  • 原文地址:https://www.cnblogs.com/3echo/p/294381.html
Copyright © 2011-2022 走看看