liutingxiang的个人博客分享 http://blog.sciencenet.cn/u/liutingxiang

博文

ArcGIS Engine二次开发学习(2)鼠标与控件互操作

已有 4659 次阅读 2018-3-29 22:04 |个人分类:地理信息系统二次开发|系统分类:教学心得

设计菜单,实现鼠标与地图控件的互操作。包括拉框放大、画/删除点线面元素(element)、框选地图要素、清除所选地图要素等。


首先,定义一个方法,包括不同的互操作类型。

public void OperGeoMap()
{
  IMap pMap = axMapControl1.Map;
  IActiveView pActiveview = pMap as IActiveView;
  IEnvelope pEnv;
  switch (strOperType)
  {
    case "LKZoomIn":
    {
       axMapControl1.Extent = axMapControl1.TrackRectangle();
      axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
      break;
    }
    case "DrawPolygon":
    {
      //新建多边形对象
      IPolygon pPolygon = axMapControl1.TrackPolygon() as IPolygon;
      //产生一个SimpleFillSymbol符号,使多边形有填充颜色和边框
      ISimpleFillSymbol pSimpleFillSym = new SimpleFillSymbolClass();
      pSimpleFillSym.Style = esriSimpleFillStyle.esriSFSDiagonalCross;
      pSimpleFillSym.Color = GetRGB(220, 112, 60);
      //产生一个PolygonElement对象
      IFillShapeElement pPolygonEle = new PolygonElementClass();
      pPolygonEle.Symbol = pSimpleFillSym;
      IElement pEle = pPolygonEle as IElement;
      pEle.Geometry = pPolygon;
      //将元素添加到Map对象中
      IGraphicsContainer pGraphicsContainer = pMap as IGraphicsContainer;
      pGraphicsContainer.AddElement(pEle, 0);
      pActiveview.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
           break;
    }                
    case "SelectMap"://数据选择
    {
      pEnv = axMapControl1.TrackRectangle();//得到一个Envelope对象
      //新建选择集环境对象
      ISelectionEnvironment pSelectionEnv = new SelectionEnvironmentClass();
      pSelectionEnv.DefaultColor = GetRGB(110, 120, 210);
      //选择要素,并将其放入选择集
      axMapControl1.Map.SelectByShape(pEnv, pSelectionEnv, false);
      axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
      break;
    }
    case "ClearMap":
    {
      axMapControl1.Map.ClearSelection();
      axMapControl1.ActiveView.Refresh();
      break;
    }

    default:
      break;
  }
}


其次,新建一些菜单,包括拉框放大、绘制多边形、数据选择、清除数据选择、取消操作、清除绘制的元素等。


最后在新建的各个菜单代码里输入调用预定义方法的代码。如下:

private void 拉框放大ToolStripMenuItem_Click(object sender, EventArgs e)
{
  strOperType = "LKZoomIn";
  this.axMapControl1.MousePointer = esriControlsMousePointer.esriPointerZoomIn;           
}
private void 绘制多边形ToolStripMenuItem_Click(object sender, EventArgs e)
{
  trOperType = "DrawPolygon";
  this.axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair;
}

private void 数据选择ToolStripMenuItem_Click(object sender, EventArgs e)
{
  strOperType = "SelectMap";
  this.axMapControl1.MousePointer = esriControlsMousePointer.esriPointerArrow;
}

private void 清除数据选择ToolStripMenuItem_Click(object sender, EventArgs e)
{
  strOperType = "ClearMap";
  this.axMapControl1.MousePointer = esriControlsMousePointer.esriPointerArrow;
  OperGeoMap();
}

private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
  if (strOperType == string.Empty)
    return;
  OperGeoMap();

}

private void 取消操作ToolStripMenuItem_Click(object sender, EventArgs e)
{
  strOperType = string.Empty;
}

private void 清除绘制的元素ToolStripMenuItem_Click(object sender, EventArgs e)
{
  strOperType = string.Empty;
  this.axMapControl1.MousePointer = esriControlsMousePointer.esriPointerArrow;
  IMap pMap = axMapControl1.Map;
  IActiveView pActiveview = pMap as IActiveView;
  IGraphicsContainer pGraphicsContainer = pMap as IGraphicsContainer;
  pGraphicsContainer.DeleteAllElements();
  axMapControl1.ActiveView.Refresh();;

}



如果上述定义的事件中有需要鼠标事件的参数,比如on_mouse_down等,则需要进行如下修改:

(1)定义一个参数,接收鼠标事件e的属性值;如ed等。

IMapControlEvents2_OnMouseDownEvent ed;

public IMapControlEvents2_OnMouseDownEvent Ed

        {

            get { return ed; }

            set { ed = value; }

        }

(2)在具体的方法定义上,如

public void OperGeoMap()中,添加的代码中需要有一个ee参数的调用,如:
case "DrawPoint":
{
     IPoint pPt = new PointClass();
     pPt.PutCoords(ed.mapX, ed.mapY);
     IMarkerElement pMarkElement = new MarkerElementClass();
     ISimpleMarkerSymbol pMarkerSymbol = new SimpleMarkerSymbolClass();
     pMarkerSymbol.Color = GetRGB(220, 120, 60);
     pMarkerSymbol.Size = 2;
     pMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSDiamond;
     IElement pElement = pMarkElement as IElement;
     pElement.Geometry = pPt;
     pMarkElement.Symbol = pMarkerSymbol;
     IGraphicsContainer pGraphicsContainer = pMap as IGraphicsContainer;
     pGraphicsContainer.AddElement(pMarkElement as IElement, 0);
     pActiveview.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
     break;
}

(3)在控件的事件代码中对预定义的鼠标事件参数ee、ed等进行赋值

ed = e;等。



https://blog.sciencenet.cn/blog-3373120-1106400.html

上一篇:ArcGIS Engine二次开发学习(1)新建、打开和保存地图文档
下一篇:ArcGIS Engine二次开发学习(3)鹰眼功能
收藏 IP: 121.69.12.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-9-19 15:30

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部