刚开始使用AO进行GIS程序设计的时候,只要遇到需要刷新ActiveView的地方,就会毫不犹豫的使用IActiveView的Refresh()方法,直到后来才知道Refresh()是整体刷新方法,而且刷新效果确实不好,整个MapControl都闪的厉害,尤其在地图文件很大的情况,其恶劣视觉冲击越明显。于是尝试着在某些地方使用IActiveView的PartialRefresh()即局部刷新方法,例如对选择集的刷新,对Element的刷新等,随着这一局部刷新方法的使用,刷新效果果然大有改观,MapControl能“平静”的做出activeview的改变,不再有用Refresh()时,那种强烈的晃动感了。
    
     今天在这里说一下我对高亮显示选择集的局部刷新的认识过程。
    
     第一阶段:每次用IFeatureSelection的SelectFeatures()选择后,一律用Refresh(),效果极差。
    
     第二阶段:在每次选择后,紧跟其后,使用esriViewGeoSelection()进行局部刷新,效果明显改善,但之后出现一个问题,即当空选的时候,即使刷新,高亮显示的仍然是上次查询的结果。
    
     第三阶段:为了修正第二阶段的问题,在空选的时候,获得ISelectionSet的count属性,若count为0,则手动调用IMap的ClearSelection()方法对上次的选择集进行清除。但是使用局部刷新方法失灵,必须改用全局刷新Refresh()。
    
     第四阶段,在AO开发帮助里注意到,对选择集的局部刷新,在选择前和选择后必须各刷新一次(When selecting features, you must call
     
PartialRefresh
     
twice, once before and once after the selection operation.),按照帮助内的方法局部刷新后,即使选择集为空,也能保证刷新掉上次的高亮选择集,而不需要使用IMap的Clear()方法或者IFeatureSelection的Clear()方法进行手动刷新。
PartialRefresh
twice, once before and once after the selection operation.),按照帮助内的方法局部刷新后,即使选择集为空,也能保证刷新掉上次的高亮选择集,而不需要使用IMap的Clear()方法或者IFeatureSelection的Clear()方法进行手动刷新。
     Eg
    
     …..
    
this
.pGeometry =
this
.MainMap.TrackCircle();
//
产生用于查询的图形
this
.MainMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,
null
,
null
);
//
选择前的局部刷新
this
.pFeatureCursor =
this
.ShopOperation.FilterByGeometry(
this
.pGeometry);
//
调用自定义的图层操作对象的空间查询方法
this
.MainMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,
null
,
null
);
//
选择后的局部刷新
…
.
| esriViewBackground | Map grids | Page/snap grid | 
| esriViewGeography | Layers | Unused | 
| *esriViewGeoSelection | Feature selection | Unused | 
| esriViewGraphics | Labels/graphics | Graphics | 
| esriViewGraphicSelection | Graphic selection | Element selection | 
| esriViewForeground | Unused | Snap guides | 
     刷新地图需要注意的几个问题:
    
     1. 放大、缩小、全图等操作后的刷新,必须使用Refresh(),假如使用某种局部刷新的话,比如使用esriViewGeography进行局部刷新,当地图上有高亮选择集的时候,该选择集就得不到刷新,高亮的位置与feature实际的位置发生偏移。所以缩放等操作的刷新,应该用全局刷新Refresh()。
    
     2. 常用的局部刷新是用esriViewGeoSelection对选择集的刷新,esriViewGraphics 对Label、Element等的刷新
    
     3. 可以将两种或两种以上的局部刷新结合使用,方法为:pActiveView.PartialRefresh(esriViewDrawPhase. esriViewGeoSelection
     
+ esriViewDrawPhase.. esriViewGraphics,null,null);
     
    
+ esriViewDrawPhase.. esriViewGraphics,null,null);
     刚开始使用AO进行GIS程序设计的时候,只要遇到需要刷新ActiveView的地方,就会毫不犹豫的使用IActiveView的Refresh()方法,直到后来才知道Refresh()是整体刷新方法,而且刷新效果确实不好,整个MapControl都闪的厉害,尤其在地图文件很大的情况,其恶劣视觉冲击越明显。于是尝试着在某些地方使用IActiveView的PartialRefresh()即局部刷新方法,例如对选择集的刷新,对Element的刷新等,随着这一局部刷新方法的使用,刷新效果果然大有改观,MapControl能“平静”的做出activeview的改变,不再有用Refresh()时,那种强烈的晃动感了。
    
     今天在这里说一下我对高亮显示选择集的局部刷新的认识过程。
    
     第一阶段:每次用IFeatureSelection的SelectFeatures()选择后,一律用Refresh(),效果极差。
    
     第二阶段:在每次选择后,紧跟其后,使用esriViewGeoSelection()进行局部刷新,效果明显改善,但之后出现一个问题,即当空选的时候,即使刷新,高亮显示的仍然是上次查询的结果。
    
     第三阶段:为了修正第二阶段的问题,在空选的时候,获得ISelectionSet的count属性,若count为0,则手动调用IMap的ClearSelection()方法对上次的选择集进行清除。但是使用局部刷新方法失灵,必须改用全局刷新Refresh()。
    
     第四阶段,在AO开发帮助里注意到,对选择集的局部刷新,在选择前和选择后必须各刷新一次(When selecting features, you must call
     
PartialRefresh
     
twice, once before and once after the selection operation.),按照帮助内的方法局部刷新后,即使选择集为空,也能保证刷新掉上次的高亮选择集,而不需要使用IMap的Clear()方法或者IFeatureSelection的Clear()方法进行手动刷新。
PartialRefresh
twice, once before and once after the selection operation.),按照帮助内的方法局部刷新后,即使选择集为空,也能保证刷新掉上次的高亮选择集,而不需要使用IMap的Clear()方法或者IFeatureSelection的Clear()方法进行手动刷新。
     Eg
    
     …..
    
this
.pGeometry =
this
.MainMap.TrackCircle();
//
产生用于查询的图形
this
.MainMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,
null
,
null
);
//
选择前的局部刷新
this
.pFeatureCursor =
this
.ShopOperation.FilterByGeometry(
this
.pGeometry);
//
调用自定义的图层操作对象的空间查询方法
this
.MainMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,
null
,
null
);
//
选择后的局部刷新
…
.
| esriViewBackground | Map grids | Page/snap grid | 
| esriViewGeography | Layers | Unused | 
| *esriViewGeoSelection | Feature selection | Unused | 
| esriViewGraphics | Labels/graphics | Graphics | 
| esriViewGraphicSelection | Graphic selection | Element selection | 
| esriViewForeground | Unused | Snap guides | 
     刷新地图需要注意的几个问题:
    
     1. 放大、缩小、全图等操作后的刷新,必须使用Refresh(),假如使用某种局部刷新的话,比如使用esriViewGeography进行局部刷新,当地图上有高亮选择集的时候,该选择集就得不到刷新,高亮的位置与feature实际的位置发生偏移。所以缩放等操作的刷新,应该用全局刷新Refresh()。
    
     2. 常用的局部刷新是用esriViewGeoSelection对选择集的刷新,esriViewGraphics 对Label、Element等的刷新
    
     3. 可以将两种或两种以上的局部刷新结合使用,方法为:pActiveView.PartialRefresh(esriViewDrawPhase. esriViewGeoSelection
     
+ esriViewDrawPhase.. esriViewGraphics,null,null);
     
    
+ esriViewDrawPhase.. esriViewGraphics,null,null);
转载于:https://www.cnblogs.com/zfg_9/archive/2009/01/04/1367913.html
 
