AE开发随笔
新建一个GIS程序
创建程序窗体应用
首先,在VS中新建一个基于Visual C# 的windows窗体应用程序
ArcMap用户界面定制
我们会看到一个空白的窗体,但一个我们要创建的是GIS程序,那肯定不能少了地图、菜单栏、工具条、状态栏······
VS的工具箱中就提供了各种工具来帮我们完善整个窗体程序,包括基础的Windows窗体工具和GIS专用的ArcGIS Windows Forms工具。依次,向窗体中添加Windows窗体工具中的MenuStrip(菜单栏)和StatusStrip(状态栏);添加ArcGIS工具箱中的ToolbarControl(工具栏)和LicenseControl(许可)。
知道一下
LicenseControl控件是所有GIS控件中唯一一个运行时看不见的,但也是必不可少的,它为我们GIS程序运用ESRI的功能提供许可。
添加完毕,将ToolbarControl属性Dock设置为Top,保存后运行看看~
(及时保存是绝绝好习惯!只要经历过闪退没保存的,都懂(T^T))
运行时却弹出 [未处理InvalidOperationException] 警告,这是怎么回事呢?警告提示axToolbarControl是无效的:
解决办法是,在program.cs中绑定ESRI的许可
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
向工具栏中添加基础工具
在Form1.cs[设计]中,右击ToolbarControl,打开属性,在Items板块下点击Add按钮,双击可以设置添加ArcGIS提供的基础控件命令。Icon可以设置图标大小。
保存运行看看,结果方向工具条的按钮都是灰色的,这是怎么回事?
这是因为ToolbarControl还没有与MapControl绑定,这些工具都没有办法使用,我们将在绑定控件这一步,解决这个问题。
添加地图容器
在Windows窗体工具箱中找到SplitContainer(分割容器),在属性中设置其Dock为Fill,填充至整个界面。再添加一个水平分割的容器到左边,水平分割:将SplitContainer2的属性Orientation改为Vertical。
添加TabControl选项版控件,设置TabPage选项页控件,TabControl属性>点击TabPage(集合)>TabPage集合编辑器,修改每一个选项页的名称内容。
给每一个对应的TabPage放置对应的控件:
选项页名称 | 控件名称 |
---|---|
地图列表 | TOCControl |
数据视图 | MapControl |
图版视图 | PageLayoutControl |
鹰眼图 | MapControl |
地图属性 | PropertyGrid |
图层属性 | PropertyGrid |
放置完成如下图所示:
绑定控件
我们想要在地图列表里实时看到已经存在的图层,让工具栏不再是灰色禁用时,就需要在窗体加载时设置工具栏和目录控件的关联。当窗体加载时(调用FrmGIS_Load事件),在该事件中,将代表工具条控件axToolbarControl1和代表地图内容列表控件axTOCControl1与地图控件axMapControl1关联起来。这样,当我们在工具栏或目录控件中进行操作时,可以同步更新axMapControl1的内容。
绑定控件有两种方法:
- 1、在属性中手动添加;
右击ToolbarControl,打开属性,将Buddy改为axMapControl1
- 2、用SetBuddyControl()绑定
在主窗体的Load事件中用代码添加绑定
private void FrmGIS_Load(object sender, EventArgs e)
{
axToolbarControl1.SetBuddyControl(axMapControl1.Object);
axTOCControl1.SetBuddyControl(axMapControl1.Object);
}
鼠标与控件的交互
在Argis中,地图列表里的快捷操作尤为重要,我们一般使用鼠标右键点击地图列表中的图层名称,在弹出的快捷菜单中打开查看该选中图层的属性对话框、属性表,实现删除图层、导出图层等操作。
//全局变量列表,全局变量耦合度比较高
//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;
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)