• ArcGIS桌面开发之—COM模式


    创建一个类库

    开启VS2008,以Visual C# >> ArcGIS >>Extending ArcObjects 下的Class Library (ArcMap)为模板创建一个新类库项目,将该项目命名为ArcMapCOM,选择合适的存储位置,单击确定,如下图所示:

    1.jpg



    删除class1 文件

    点击完成后,项目创建了默认的class1.cs 文件,因为在该项目中不会使用该文件,所以删除该文件,如下图:

    3.jpg

    添加命令模板

    添加一个命令模板,在项目上右键,添加,然后找到ArcGIS/Extending ArcObjects/BaseCommand,如下图:

    4.jpg

    点击添加后,弹出ArcGIS Project Wizard,可以利用该向导添加ESRI 对象库引用。因为现在创建的是ArcGIS Desktop 应用程序,所以只有与ArcGIS Desktop 相关的程序集,ESRI 提供的ESRI.ArcGIS.ADF.Local 程序集包含了ESRI.ArcGIS.ADF.BaseClasses 命名空间,可以继承该程序集所提供的一些抽象类来创建一个自定义命令/工具。该程序集还包含了ESRI.ArcGIS.ADF.CATIDs 命名空间,其中的一些类可用于注册组件至合适的ESRI组件类别。我们选择的dll如下:


    5.jpg


    2.jpg

    编写相关代码


    向导为我们生成了下面的模板,我们需要添加相应的代码,如下图:

    6.jpg



    1.   IMxDocument pMxd;
    2.         public CommandTest()
    3.         {
    4.             //
    5.             //
    6.             base.m_category = "COMTest"; //localizable text
    7.             base.m_caption = "COMTest";  //localizable text
    8.             base.m_message = "COMTest";  //localizable text 
    9.             base.m_toolTip = "COMTest";  //localizable text 
    10.             base.m_name = "COMTest";   //unique id, non-localizable (e.g. "MyCategory_ArcMapCommand")
    11.             try
    12.             {
    13.                 string bitmapResourceName = GetType().Name + ".bmp";
    14.                 base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
    15.             }
    16.             catch (Exception ex)
    17.             {
    18.                 System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
    19.             }
    20.         }
    21.         #region Overridden Class Methods

    22.         public override void OnCreate(object hook)
    23.         {
    24.             if (hook == null)
    25.                 return;
    26.             m_application = hook as IApplication;
    27.             if (hook is IMxApplication)
    28.             {
    29.                 base.m_enabled = true;
    30.                 pMxd = m_application.Document as IMxDocument;
    31.             }
    32.             else
    33.             {
    34.                 base.m_enabled = false;
    35.             }
    36.                
    37.         }
    38.         public override void OnClick()
    39.         {

    40.             IMap pMap = pMxd.FocusMap;
    41.             MessageBox.Show(pMap.Name);
    42.         }
    43.         /// <summary>
    44.         /// 检查是否可用
    45.         /// </summary>
    46.         public override bool Enabled
    47.         {
    48.             get
    49.             {
    50.                 return ISEnabled();
    51.             }
    52.         }
    53.         public bool ISEnabled()
    54.         {
    55.             int pLayerCount = pMxd.FocusMap.LayerCount;
    56.             if (pLayerCount > 0)
    57.                 return true;
    58.             else
    59.                 return false;
    60.         }
    61.       
    62.         #endregion
    复制代码


    其中ISEnabled函数用来检查是否可用,因为Enable的属性是定义在父类中的,ArcMap自动会检查该属性,应该是500毫秒,当这个属性为false的时候,命令不可用,而OnCreate函数在构造函数调用之后,也由系统调用,传入了一个Hook,这个Hook可以这么认为,我们自定义了一个命令,那么这个命令是和那个应用程序做交互呢,因为我们选择的是ArcMap,所以可以认为这个hook就是ArcMap。


    注册



    因为是COM的,所以就存在注册,记住在ArcGIS 10 中,Esri提供了一个注册工具,以后只能用这个工具注册,用微软的regsvr32 注册会失败,该工具在C:Program Files (x86)Common FilesArcGISin下面(我电脑是64位的,这个路径因系统而有不同),工具就是ESRIRegAddIn.exe,我们从CMD进入该目录,然后使用一下命令注册:

    11.jpg


    12.jpg

    使用自定义命令


    打开ArcMap 通过Customize找到这个命令,然后拖到菜单上,如下:

    7.jpg

    8.jpg

    当我们将图层删掉后,发现命令不可用了,如下图:

    9.jpg

    这就是因为我们在这个命令中写了一个判断,当图层的个数小于1的时候Enabled属性为false,而ArcMap自动检查这个属性,当属性为false的时候,命令不可用。

    当我们点这个按钮的时候,出现如下信息:

    10.jpg



    这说明我们的自定义命令是成功的。

    小结:ArcGIS 10 提供了Add-In的开发模式(http://bbs.esrichina-bj.cn/esri/thread-105114-1-1.html),但是同时保留了早期的COM的这种方式,建议大家在使用的时候都使用Add-In,为什么,下篇我们将会对迁移做一下介绍,欢迎讨论。

  • 相关阅读:
    bzoj1015星球大战(并查集+离线)
    bzoj1085骑士精神(搜索)
    bzoj1051受欢迎的牛(Tarjan)
    左偏树学习
    hdu1512 Monkey King(并查集,左偏堆)
    左偏树(模板)
    PAT (Basic Level) Practice (中文) 1079 延迟的回文数 (20分) (大数加法)
    PAT (Basic Level) Practice (中文) 1078 字符串压缩与解压 (20分) (字符转数字——栈存放)
    PAT (Basic Level) Practice (中文) 1077 互评成绩计算 (20分) (四舍五入保留整数)
    PAT (Basic Level) Practice (中文) 1076 Wifi密码 (15分)
  • 原文地址:https://www.cnblogs.com/giser-whu/p/3707045.html
Copyright © 2020-2023  润新知