打造自己地图AxTOCContrl树形控件——XUTocControl(成功解决节点控件拖拽问题)
2011-05-06 23:05
911 查看
最近在搞应用于Windows平板电脑的系统开发,需要开发适用于平板电脑的地图控制控件取代ArcEngine自带的AxTOCContrl。
搞控件开发太费脑啦,需要注意的逻辑关系很复杂 都晕倒啦!
View Code
namespace GC_Controls
{
public partial class XUTocControl : UserControl
{
private ESRI.ArcGIS.Controls.AxMapControl _MapCtrl;
public XUTocControl()
{
InitializeComponent();
}
public XUTocControl(AxMapControl mapCtrl)
{
InitializeComponent();
_MapCtrl = mapCtrl;
InitTOC(mapCtrl.Map, this.MainBar);
}
/// <summary>
/// 初始化图层工具
/// </summary>
/// <param name="map"></param>
/// <param name="mainBar"></param>
private void InitTOC(IMap map,XUNaviBar mainBar)
{
MainBar.Text = map.Name;
//保存地图对象
MainBar.Tag = _MapCtrl;
for (int j = 0; j < map.LayerCount; j++)
{
ILayer2 pLayer = map.get_Layer(j) as ILayer2;
if (pLayer is ESRI.ArcGIS.Carto.IGroupLayer)
{
ICompositeLayer pCompositelayer;
pCompositelayer = (ICompositeLayer)pLayer;
XUNaviBar nvBar = new XUNaviBar(mainBar, pLayer);
nvBar.Tag = _MapCtrl;
int i= 0;
ILayer2 pLyr;
for (i = 0; i < pCompositelayer.Count; i++)
{
pLyr = pCompositelayer.get_Layer(i) as ILayer2;
XUBarNode tmpNode = new XUBarNode(nvBar, pLyr.Name, pLyr.Name);
//保存图层对象
tmpNode.Tag = pLyr;
nvBar.AddBarNode(tmpNode);
}
MainBar.AddBar(nvBar);
nvBar.Dock = DockStyle.Top;
}
else
{
XUBarNode tmpNode = new XUBarNode(mainBar, pLayer.Name, pLayer.Name);
//保存图层对象
tmpNode.Tag = pLayer;
MainBar.AddBarNode(tmpNode);
}
}
}
private void node_click(object sender, EventArgs e)
{
_MapCtrl.ActiveView.Refresh();
}
}
调用控件的示例代码:该控件使用时,需要ArcEngine 9.3 Runtime.
private void FormTest_Load(object sender, EventArgs e)
{
this.axMapControl1.LoadMxFile(Application.StartupPath + "\\geodata\tgwGD.mxd");
XUTocControl tocCtrl = new XUTocControl(this.axMapControl1);
this.panel1.Controls.Add(tocCtrl);
tocCtrl.Dock = DockStyle.Fill;
}
实现控件的节点拖拽功能参照了下列资料,在此表示感谢!
http://bbs.zbitedu.com/viewthread.php?tid=8711
http://www.cnblogs.com/ttc/archive/2008/08/21/1273172.html
http://www.cppblog.com/AutomateProgram/archive/2010/08/26/124890.html
http://kb.cnblogs.com/a/1671126/
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dodragdrop.aspx#Y6514
此外,WorldWind里也有拖拽文件功能WorldWind学习系列十六:3D Cross Section插件功能分析——TerrainViewer ,拖拽控件和拖拽文件本质上是一样的,只是拖拽控件是将控件作为数据用于传递而已。
本博客声明:本人的技术探索过程中,得到了国信司南公司方面支持。今后,本人博客里的所有技术探索成果将归“无痕客”、“国信司南”和“博客园”三方共同所有,原创作品如需转载,请注明本博客声明。
搞控件开发太费脑啦,需要注意的逻辑关系很复杂 都晕倒啦!
View Code
namespace GC_Controls
{
public partial class XUTocControl : UserControl
{
private ESRI.ArcGIS.Controls.AxMapControl _MapCtrl;
public XUTocControl()
{
InitializeComponent();
}
public XUTocControl(AxMapControl mapCtrl)
{
InitializeComponent();
_MapCtrl = mapCtrl;
InitTOC(mapCtrl.Map, this.MainBar);
}
/// <summary>
/// 初始化图层工具
/// </summary>
/// <param name="map"></param>
/// <param name="mainBar"></param>
private void InitTOC(IMap map,XUNaviBar mainBar)
{
MainBar.Text = map.Name;
//保存地图对象
MainBar.Tag = _MapCtrl;
for (int j = 0; j < map.LayerCount; j++)
{
ILayer2 pLayer = map.get_Layer(j) as ILayer2;
if (pLayer is ESRI.ArcGIS.Carto.IGroupLayer)
{
ICompositeLayer pCompositelayer;
pCompositelayer = (ICompositeLayer)pLayer;
XUNaviBar nvBar = new XUNaviBar(mainBar, pLayer);
nvBar.Tag = _MapCtrl;
int i= 0;
ILayer2 pLyr;
for (i = 0; i < pCompositelayer.Count; i++)
{
pLyr = pCompositelayer.get_Layer(i) as ILayer2;
XUBarNode tmpNode = new XUBarNode(nvBar, pLyr.Name, pLyr.Name);
//保存图层对象
tmpNode.Tag = pLyr;
nvBar.AddBarNode(tmpNode);
}
MainBar.AddBar(nvBar);
nvBar.Dock = DockStyle.Top;
}
else
{
XUBarNode tmpNode = new XUBarNode(mainBar, pLayer.Name, pLayer.Name);
//保存图层对象
tmpNode.Tag = pLayer;
MainBar.AddBarNode(tmpNode);
}
}
}
private void node_click(object sender, EventArgs e)
{
_MapCtrl.ActiveView.Refresh();
}
}
调用控件的示例代码:该控件使用时,需要ArcEngine 9.3 Runtime.
private void FormTest_Load(object sender, EventArgs e)
{
this.axMapControl1.LoadMxFile(Application.StartupPath + "\\geodata\tgwGD.mxd");
XUTocControl tocCtrl = new XUTocControl(this.axMapControl1);
this.panel1.Controls.Add(tocCtrl);
tocCtrl.Dock = DockStyle.Fill;
}
实现控件的节点拖拽功能参照了下列资料,在此表示感谢!
http://bbs.zbitedu.com/viewthread.php?tid=8711
http://www.cnblogs.com/ttc/archive/2008/08/21/1273172.html
http://www.cppblog.com/AutomateProgram/archive/2010/08/26/124890.html
http://kb.cnblogs.com/a/1671126/
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dodragdrop.aspx#Y6514
此外,WorldWind里也有拖拽文件功能WorldWind学习系列十六:3D Cross Section插件功能分析——TerrainViewer ,拖拽控件和拖拽文件本质上是一样的,只是拖拽控件是将控件作为数据用于传递而已。
本博客声明:本人的技术探索过程中,得到了国信司南公司方面支持。今后,本人博客里的所有技术探索成果将归“无痕客”、“国信司南”和“博客园”三方共同所有,原创作品如需转载,请注明本博客声明。
相关文章推荐
- 希望控件【解决】mfc grid control问题:无水平滚动条(scrollbar)、垂直滚动条只有向上部分、向下部分看不到
- 解决Win32 SDK编程添加list control控件程序无法运行的问题 . 和如何画进度条
- 20130507解决SilverLight项目使用DevExpress GridControl控件,修改列背景问题
- 游标递归解决树形节点删除问题
- 自己的maven jar 包发布到私服服务器不成功,问题解决方案
- Android Studio该如何导入别人的开源库到自己的项目中并使用库中的控件,网上找过方法但是并不能搞定,希望实际问题 实际解决,拯救我这个傻瓜
- [置顶] MFC树形控件CTreeCtrl使用方法、遍历、SetCheck无效、根据名称获取节点、获取选中节点等问题
- 解决Win32 SDK编程添加list control控件程序无法运行的问题
- 解决使用MasterPage后,Page.FindControl方法找不到指定控件的问题
- 解决Win32 SDK编程添加list control控件程序无法运行的问题
- ::GetDlgItem调用 窗口控件遇到的中断 (自己遇到的问题,已被解决)
- 关于AjaxControlToolkit的Accordion控件在vs2008下报错的问题及解决办法
- 自己写的一个用于解决DateTimePicker的值无法为Null的控件.不过有问题.需要请各位帮忙看一下问题出在哪.
- GridView中使用类似于Button btnToped = (Button)e.Row.FindControl("btnToped");提示“未将对象引用到实例”,也就是找不到控件的问题的解决方法
- [网络收集]解决在母版页中使用Page.FindControl方法找不到指定控件的问题
- 自己在使用Android Maps API 开发地图应用程序时遇到的问题,以及解决的办法
- android:layout_margin真实含义 及 自己定义复合控件 layout()运行无效的问题解决
- iOS 使用百度地图地图画成功了,但是没有图层显示问题解决。
- CTreeCtrl 拖拽节点信息显示问题解决
- 关于KFCEditor控件INPUT等不能拖拽改变大小的问题(已解决)