zoukankan      html  css  js  c++  java
  • 向ArcGIS的ToolBarControl中添加任意的windows控件的方法

    概要:在使用ArcEngine开发中,给ToolbarControl添加按钮形式的命令项相信大家都很熟悉了,因为网上的例子很多。但这种使用click调用功能的方式只能满足大部分用户在体验方面的需求,除此之外用户很可能要求你在工具条中增加类似文本框,单选框、选择面板,combobox等windows控件,今天有个同事问我这个问题就在这里做一个实例。供大家参考。

    具体实现:

      1 知识整备

     (1 )其实要实现这个效果很简单,只要大家了解Arcgis中的IToolControl接口的使用方法,就不难实现。

       IToolControl 这个接口有只有简单的三个方法:

     
    hwnd:是个只读属性,用于给调用者返回控件 句柄。
    OnDrop:是一个方法,用于调用者验证当前控件是否可拖动。
    OnFocus:是一个方法,用于调用通知当前项,你已经聚焦。
    (2)除了了解IToolCotrol接口之外,大家还必须具备知道如何创建Arcgis 命令插件的知识,以及如何调用插件的方法。
     
    2 实现
       以一个简单Combobox为例:
        public sealed class Command1 : BaseCommand, IToolControl
        {
     

            private int _handle = 0;
            private ICompletionNotify _CompNotify;
            private System.Windows.Forms.ComboBox comboBox = new System.Windows.Forms.ComboBox();
            private IHookHelper m_hookHelper = null;
            public Command1()
            {
                this._handle = comboBox.Handle.ToInt32();
                comboBox.Items.Add("大家好才是真的好1");
                comboBox.Items.Add("大家好才是真的好1");
                comboBox.Items.Add("大家好才是真的好1");
            }

            #region Overriden Class Methods

            /// <summary>
            /// Occurs when this command is created
            /// </summary>
            /// <param name="hook">Instance of the application</param>
            public override void OnCreate(object hook)
            {
                if (hook == null)
                    return;

                try
                {
                    m_hookHelper = new HookHelperClass();
                    m_hookHelper.Hook = hook;
                    if (m_hookHelper.ActiveView == null)
                        m_hookHelper = null;
                }
                catch
                {
                    m_hookHelper = null;
                }

                if (m_hookHelper == null)
                    base.m_enabled = false;
                else
                    base.m_enabled = true;

                // TODO:  Add other initialization code
            }

            /// <summary>
            /// Occurs when this command is clicked
            /// </summary>
            public override void OnClick()
            {
                // TODO: Add Command1.OnClick implementation
            }

            #endregion

            #region IToolControl 成员

            public bool OnDrop(esriCmdBarType barType)
            {
                if (barType == esriCmdBarType.esriCmdBarTypeToolbar)
                {
                    return true;
                }
                else return false;
            }

            public void OnFocus(ICompletionNotify complete)
            {
                _CompNotify = complete;
            }

            public int hWnd
            {
                get
                {
                    return _handle;
                }
            }

            #endregion
        }

    3 实现效果
     
    照着这个实例可以添加,其它的windows控件
    using System;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using ESRI.ArcGIS.ADF.BaseClasses;
    using ESRI.ArcGIS.ADF.CATIDs;
    using ESRI.ArcGIS.Controls;
    using ESRI.ArcGIS.SystemUI;
    
    namespace AddCustomControlToToolbar
    {
        /// <summary>
        /// Command that works in ArcMap/Map/PageLayout
        /// </summary>
        [Guid("7e8238b9-b38c-417c-894f-34ca9d99b634")]
        [ClassInterface(ClassInterfaceType.None)]
        [ProgId("AddCustomControlToToolbar.Command1")]
        public sealed class Command1 : BaseCommand, IToolControl
        {
            #region COM Registration Function(s)
            [ComRegisterFunction()]
            [ComVisible(false)]
            static void RegisterFunction(Type registerType)
            {
                // Required for ArcGIS Component Category Registrar support
                ArcGISCategoryRegistration(registerType);
    
                //
                // TODO: Add any COM registration code here
                //
            }
    
            [ComUnregisterFunction()]
            [ComVisible(false)]
            static void UnregisterFunction(Type registerType)
            {
                // Required for ArcGIS Component Category Registrar support
                ArcGISCategoryUnregistration(registerType);
    
                //
                // TODO: Add any COM unregistration code here
                //
            }
    
            #region ArcGIS Component Category Registrar generated code
            /// <summary>
            /// Required method for ArcGIS Component Category registration -
            /// Do not modify the contents of this method with the code editor.
            /// </summary>
            private static void ArcGISCategoryRegistration(Type registerType)
            {
                string regKey = string.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID);
                MxCommands.Register(regKey);
                ControlsCommands.Register(regKey);
            }
            /// <summary>
            /// Required method for ArcGIS Component Category unregistration -
            /// Do not modify the contents of this method with the code editor.
            /// </summary>
            private static void ArcGISCategoryUnregistration(Type registerType)
            {
                string regKey = string.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID);
                MxCommands.Unregister(regKey);
                ControlsCommands.Unregister(regKey);
            }
    
            #endregion
            #endregion
    
            private int _handle = 0;
            private ICompletionNotify _CompNotify;
            private System.Windows.Forms.ComboBox comboBox = new System.Windows.Forms.ComboBox();
            private IHookHelper m_hookHelper = null;
            public Command1()
            {
                this._handle = comboBox.Handle.ToInt32();
                comboBox.Items.Add("大家好才是真的好1");
                comboBox.Items.Add("大家好才是真的好1");
                comboBox.Items.Add("大家好才是真的好1");
            }
    
            #region Overriden Class Methods
    
            /// <summary>
            /// Occurs when this command is created
            /// </summary>
            /// <param name="hook">Instance of the application</param>
            public override void OnCreate(object hook)
            {
                if (hook == null)
                    return;
    
                try
                {
                    m_hookHelper = new HookHelperClass();
                    m_hookHelper.Hook = hook;
                    if (m_hookHelper.ActiveView == null)
                        m_hookHelper = null;
                }
                catch
                {
                    m_hookHelper = null;
                }
    
                if (m_hookHelper == null)
                    base.m_enabled = false;
                else
                    base.m_enabled = true;
    
                // TODO:  Add other initialization code
            }
    
            /// <summary>
            /// Occurs when this command is clicked
            /// </summary>
            public override void OnClick()
            {
                // TODO: Add Command1.OnClick implementation
            }
    
            #endregion
    
            #region IToolControl 成员
    
            public bool OnDrop(esriCmdBarType barType)
            {
                if (barType == esriCmdBarType.esriCmdBarTypeToolbar)
                {
                    return true;
                }
                else return false;
            }
    
            public void OnFocus(ICompletionNotify complete)
            {
                _CompNotify = complete;
            }
    
            public int hWnd
            {
                get
                {
                    return _handle;
                }
            }
    
            #endregion
        }
    }
  • 相关阅读:
    用户和用户组管理
    浏览器从输入URL到页面加载显示完成全过程解析
    easyui form提交和formdata提交记录,查看FormData对象内部的值
    Hybrid App中原生页面 VS H5页面(分享)
    ui-router .state参数配置
    利用webpack手动构建vue工程
    使用json对象要注意的地方
    js中使用0 “” null undefined {}需要注意
    已知宽高和未知宽高的div块的水平垂直居中
    jquery easyui datagrid 空白条处理 自适应宽高 格式化函数formmater 初始化时会报错 cannot read property 'width'||'length' of null|undefined
  • 原文地址:https://www.cnblogs.com/gisoracle/p/5982449.html
Copyright © 2011-2022 走看看