新建一个GIS程序
创建程序窗体应用
首先,在VS中新建一个基于Visual C# 的windows窗体应用程序
添加可视化控件
我们会看到一个空白的窗体,但一个我们要创建的是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 |
放置完成如下图所示:
绑定控件
右击ToolbarControl,打开属性,将Buddy改为axMapControl1
以同样的方式,将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