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
        }
    }
  • 相关阅读:
    Linux下判断字符串长度
    Linux下使用xargs得到字符串作为参数进行输出、awk得到字符串作为参数进行输出
    Linux下使用xargs将多行文本转换成一行并用tr实现逗号隔开
    Linux下使用split按行数进行切割
    Maven设置snapshot无法在远程仓库下载的问题解决
    Intellij IDEA自动生成serialVersionUID
    Spring中@Value用法收集
    Http报头Accept与Content-Type的区别(转)
    Linux下Shell的for循环语句
    Shell脚本中的分号使用
  • 原文地址:https://www.cnblogs.com/gisoracle/p/5982449.html
Copyright © 2011-2022 走看看