ArcGIS Engine开发鹰眼图的功能(代码优化篇)

在上一篇,ArcGIS Engine开发鹰眼图的功能(基础篇)

上一篇的实现效果图如下,

 

如果仔细观察,会发现一个问题,即在“鹰眼”的区域,只要在红色线框内的注记会被覆盖。

 

 如果红色框包括整张图的话,图上的注记都将不会显示。

 

是什么原因造成的呢?

原因是使用IFillShapeElement向鹰眼视图添加绘图框后,标注与绘图框冲突造成互相压盖。

我们来看一张表,

 

 在基础篇中,我们使用的是IFillShapeElement面要素进行刷新的,现在我们改换为线要素的IScreenDisplay DrawPloyline

替换基础篇中的面要素刷新方法即可

/// <summary>
/// 使用线要素刷新(已解决重叠问题)(推荐使用)
/// 使用IScreenDisplay的DrawPolyline方法,在鹰眼视图画出红线框
/// </summary>
/// <param name="activeView">鹰眼视图的活动窗体</param>
/// <param name="geometry">制框范围</param>
private void DrawPolyline(IActiveView activeView, IGeometry geometry)
{
    if (activeView == null)
        return; //如果活动窗体为空, 则返回
    //强行刷新鹰眼视图, 目的: 清除前一次的绘图框, 避免重复绘图框
    axMapControl2.ActiveView.ScreenDisplay.UpdateWindow(); //解决重复绘图框的关键代码
    IScreenDisplay screenDisplay = activeView.ScreenDisplay;
    //Screen的绘图状态处于准备状态
    //参数: (指定设备(Dc=Device), 缓冲区(-1=NoScreenCache,-2=AllScreenCache, -3=ScreenRecoding))
    //解析: 设备(Device)参数指图形的绘制区域
    //缓冲区(Cache)参数指图形是否经由缓存后再绘制在屏幕(Window/Screen)上。
    //一般默认为NoScreenCache, 即不经过缓存直接绘制
    screenDisplay.StartDrawing(screenDisplay.hDC, (System.Int16)esriScreenCache.esriNoScreenCache);
    //实例化颜色对象
    IRgbColor rgbColor = new RgbColorClass();
    rgbColor.Red = 255;
    IColor color = rgbColor;
    //实例化符号(Symbol)对象
    ISimpleLineSymbol simpleLineSymbol = new SimpleLineSymbolClass();
    simpleLineSymbol.Color = color;
    simpleLineSymbol.Width = 2;
    ISymbol symbol = (ISymbol)simpleLineSymbol;
    screenDisplay.SetSymbol(symbol);
    screenDisplay.DrawPolyline(geometry);
    screenDisplay.FinishDrawing();
}

 

刚才我们在表格中注意到,使用线刷新,虽然不会覆盖注记,但绘图框难以实时更新,产生重复。因此,我们在代码中,可以完美解决该问题

//强行刷新鹰眼视图, 目的: 清除前一次的绘图框, 避免重复绘图框
axMapControl2.ActiveView.ScreenDisplay.UpdateWindow(); 

 

最终效果图:

 

谢谢观看!本人初学GIS二次开发,如果有不对的地方,请多多包涵!

posted @ 2019-10-24 14:44  the_path_of_grace  阅读(1555)  评论(0编辑  收藏  举报