首页 > 其他分享 >AE开发随笔

AE开发随笔

时间:2024-05-27 21:56:48浏览次数:24  
标签:控件 null AE axMapControl1 pLayer 开发 窗体 随笔 axTOCControl1

新建一个GIS程序

创建程序窗体应用

  首先,在VS中新建一个基于Visual C# 的windows窗体应用程序
image

添加可视化控件

  我们会看到一个空白的窗体,但一个我们要创建的是GIS程序,那肯定不能少了地图、菜单栏、工具条、状态栏······
image
  VS的工具箱中就提供了各种工具来帮我们完善整个窗体程序,包括基础的Windows窗体工具GIS专用的ArcGIS Windows Forms工具。依次,向窗体中添加Windows窗体工具中的MenuStrip(菜单栏)和StatusStrip(状态栏);添加ArcGIS工具箱中的ToolbarControl(工具栏)和LicenseControl(许可)。

题外话
  LicenseControl控件是所有GIS控件中唯一一个运行时看不见的,但也是必不可少的,它为我们GIS程序运用ESRI的功能提供许可。

image
  添加完毕,将ToolbarControl属性Dock设置为Top,保存后运行看看~
  (及时保存是绝绝好习惯!只要经历过闪退没保存的,都懂(T^T))

  运行时却弹出 [未处理InvalidOperationException] 警告,这是怎么回事呢?警告提示axToolbarControl是无效的:
image
  解决办法是,在program.cs中绑定ESRI的许可
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
image

向工具栏中添加基础工具

  在Form1.cs[设计]中,右击ToolbarControl,打开属性,在Items板块下点击Add按钮,双击可以设置添加ArcGIS提供的基础控件命令。Icon可以设置图标大小。
image
保存运行看看,结果方向工具条的按钮都是灰色的,这是怎么回事?
image
这是因为ToolbarControl还没有与MapControl绑定,这些工具都没有办法使用,我们将在绑定控件这一步,解决这个问题。

添加地图容器

  在Windows窗体工具箱中找到SplitContainer(分割容器),在属性中设置其Dock为Fill,填充至整个界面。再添加一个水平分割的容器到左边,水平分割:将SplitContainer2的属性Orientation改为Vertical。
image

  添加TabControl选项版控件,设置TabPage选项页控件,TabControl属性>点击TabPage(集合)>TabPage集合编辑器,修改每一个选项页的名称内容。
image
  给每一个对应的TabPage放置对应的控件:

选项页名称 控件名称
地图列表 TOCControl
数据视图 MapControl
图版视图 PageLayoutControl
鹰眼图 MapControl
地图属性 PropertyGrid
图层属性 PropertyGrid

  放置完成如下图所示:
image

绑定控件

  右击ToolbarControl,打开属性,将Buddy改为axMapControl1
image
  以同样的方式,将TOCControl的Buddy也改为axMapControl1。
  除了手动设置,还可以在主窗体的Load事件中用代码添加绑定。代码如下:

private void FrmGIS_Load(object sender, EventArgs e)
        {
            axToolbarControl1.SetBuddyControl(axMapControl1.Object);
            axTOCControl1.SetBuddyControl(axMapControl1.Object);
        }

设置地图列表的鼠标点击设置

//全局变量列表,全局变量耦合度比较高
        //Toc输出变量
        esriTOCControlItem pItem = esriTOCControlItem.esriTOCControlItemNone;
        IBasicMap pBasicMap = null;
        ILayer pLayer = null;
        object pUnk = null;
        object pData = null;

        //定义快捷菜单
        IToolbarMenu pMapToolbarMenu = null; //地图快捷菜单
        IToolbarMenu pLayerToolbarMenu = null; //图层快捷菜单
        private void axTOCControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.ITOCControlEvents_OnMouseDownEvent e)
        {
            axTOCControl1.HitTest(e.x, e.y, ref pItem, ref pBasicMap, ref pLayer, ref pUnk, ref pData);
	//第三个以后得参数,都是输出的参数,不是输入的参数,这些参数都需要ref修饰
            if (e.button == 1)//左键
            {
                if (pItem == esriTOCControlItem.esriTOCControlItemLayer)
                {
                    axMapControl1.CustomProperty = pLayer;
                }
                else if (pItem == esriTOCControlItem.esriTOCControlItemMap)
                {
                    axMapControl1.CustomProperty = pBasicMap;
                }
                return;
            }
            else if (e.button == 2)//右键
            {
                if (pItem == esriTOCControlItem.esriTOCControlItemMap)
                {
                    if (pBasicMap != null)
                    {
                        //用户点击的是地图,要将地图选中,我们就需要使用selectItem方法

                        axTOCControl1.SelectItem(pBasicMap, null);
                        //axMapControl1有一个用于传参数的属性——Customproperty
                        axMapControl1.CustomProperty = pBasicMap;
                        pMapToolbarMenu.PopupMenu(e.x, e.y, axTOCControl1.hWnd);
                        //在用户点击的位置弹出快捷菜单
                    }
                }
                else if (pItem == esriTOCControlItem.esriTOCControlItemLayer)
                {

                    if (pLayer != null)
                    {
                        //选中当前用户点击的图层
                        axTOCControl1.SelectItem(pLayer, null);
                        //axMapControl1设置它的自定义属性的属性值
                        axMapControl1.CustomProperty = pLayer;

                        //MessageBox.Show(pLayer.Name);
                        pLayerToolbarMenu.PopupMenu(e.x, e.y, axTOCControl1.hWnd);
                        return;
                    }
                }
            }
        }

标签:控件,null,AE,axMapControl1,pLayer,开发,窗体,随笔,axTOCControl1
From: https://www.cnblogs.com/yitingpan/p/18216477

相关文章

  • 开发一个中小学生学习数学软件的用户调研
    如果要开发一个中小学生学习数学的软件应该找以下几类人进行用户调研:教师:教师是中小学生学习数学过程中的重要参与者,他们对于教学内容、教学方法和学生需求有深入的了解。通过与教师进行沟通和访谈,可以了解到学生在数学学习中面临的困难、需求和偏好,从而设计出更贴近实际教学需......
  • Windows 7 任务栏开发 之 进度条(Progress Bar)
         上一篇我们完成了“覆盖图标”(OverlayIcon)的相关开发,本篇我们将对进度条特性进行研究。在使用IE下载文件时,任务栏图标会同步显示当前下载进度(如下图)。那么在应用程序中如何实现这个效果呢? 下载状态 TaskbarManager.SetProgressValue 方法      在Tas......
  • Vue3实战笔记(46)—Vue 3高效开发定制化Dashboard的权威手册
    文章目录前言Dashboard开发总结前言后台管理系统中的Dashboard是一种图形化的信息显示工具,通常用于提供一个特定领域或系统的概况。它可以帮助用户监控和分析数据,快速获取重要信息。可以帮助用户监控业务状况、分析数据、获取关键信息和管理资源。通过合理的设计和......
  • 关于软件开发模型(什么是DevOps?)
    DevOps(Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。DevOps一开始指的只是开发运维一体化,扩大到......
  • AI智能体研发之路-模型篇(四):一文入门pytorch开发
    博客导读:《AI—工程篇》AI智能体研发之路-工程篇(一):Docker助力AI智能体开发提效AI智能体研发之路-工程篇(二):Dify智能体开发平台一键部署AI智能体研发之路-工程篇(三):大模型推理服务框架Ollama一键部署​​​​​​​AI智能体研发之路-工程篇(四):大模型推理服务框架Xinference一......
  • 敏捷开发
    敏捷开发是一种灵活且响应变化的软件开发方法,其核心原则是迭代开发。这意味着大的开发任务被拆分成一系列连续的小周期,每个周期(即迭代)都包含了从需求分析到部署和评估的完整开发流程。通过这种方式,开发团队能够逐步改进软件,确保每个迭代都产出可用的软件增量。增量开发是敏捷开发......
  • 如何挑选一个合适的HIS系统? 基于B/S架构,JAVA语言,springboot最新技术栈开发的整套云HIS
    如何挑选一个合适的HIS系统?基于B/S架构,JAVA语言,springboot最新技术栈开发的整套云HIS系统源码HIS源码最近有很多人在询问,有没有最优秀的HIS系统?在这里小编是没办法回答的。为什么呢?因为要看你站在什么样的角度,如果是从医院的角度来说,那么我会建议你看看这篇文章,看看什么是......
  • 基于翔云C#语言的身份证实名认证接口开发示例
    现如今,安全与便捷成为了互联网服务的两大关键词。为了进一步提升用户体验并加强网络安全管理,国内多家主流App近日宣布完成一项重要功能升级——集成身份证实名认证系接口。这一举措标志着用户在进行App注册时,将享受到更加高效、安全的身份验证体验。以往,用户在注册各类App......
  • 性能怪兽!香橙派 Kunpeng Pro 开发板深度测评,带你解锁无限可能
    性能怪兽!香橙派KunpengPro开发板深度测评,带你解锁无限可能文章目录性能怪兽!香橙派KunpengPro开发板深度测评,带你解锁无限可能一、背景二、香橙派KunpengPro硬件规格概述三、使用准备与系统安装1️⃣、系统安装步骤2️⃣、远程SSH登录开发板四、香橙派KunpengPr......
  • 公司刚入职了一名 Java 中级开发,短短 4 行代码居然凑齐了 3 个 bug!我哭了~~
    作者:l拉不拉米链接:https://juejin.cn/post/7031445206152577061一、前言公司刚入职了一名中级Java开发,经过一个星期的适应学习,各方面表现还不错,于是分配了一个小的迭代给新人做。需求很简单,把从第三方拉取的数据匹配到自身公司后台设置的渠道后,聚合到一个列表中,批量入库。然......