그래픽을 그린 후보기를 새로 고치는 가장 좋은 방법은 무엇입니까?


9

버튼 클릭시 다각형을 그려 지형지 물을 강조 표시합니다. 그런 다음 새 다각형을 표시하려면 ActiveView를 새로 고쳐야합니다. 이 라인은 작동합니다.

mapControl.ActiveView.ScreenDisplay.StartDrawing(StartDrawing(mapControl.ActiveView.ScreenDisplay.hDC, (System.Int16)ESRI.ArcGIS.Display.esriScreenCache.esriNoScreenCache);
mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);
mapControl.ActiveView.ScreenDisplay.FinishDrawing();
mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewAll, feature.Extent, null);

그러나 항상 모든 레이어를 다시로드합니다. PartialRefresh다른 방법으로 전화하는 거의 모든 방법을 시도 esriViewDrawPhase했지만 그 중 어느 것도 새로운 다각형을 보여주지 못했습니다.

다시 그리는 것보다 더 나은 해결책이 esriViewDrawPhase.esriViewAll있습니까?

최신 정보

나는 사용 ILayerExtensionDraw.AfterDraw그리기 단계를 테스트하고 AfterDraw만을 위해 가져옵니다 히트 PartialRefresh()와 함께 esriViewAll. 확장은 MapControl.Layers의 모든 레이어에 추가됩니다. 매번 맞을 것으로 예상 했습니까? mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);AfterDraw가 올라가지 않도록 어느 레이어에서 그리나요?

대답

Kirk 덕분에 레이어를 다시로드하지 않고 새로 추가 된 그래픽을 보여주는 솔루션이 있습니다.

IGraphicsContainer con = _mapControl.Map as IGraphicsContainer;
if (con != null)
{
  IFillShapeElement fillShapeElement = new PolygonElementClass();
  fillShapeElement.Symbol = fillSymbol;
  IElement element = (IElement)fillShapeElement;
  element.Geometry = feature.Shape;
  con.DeleteAllElements();
  con.AddElement(element, 0);
  _mapControl.ActiveView.ScreenDisplay.Invalidate(feature.Extent, true, _mapControl.ActiveView.get_ScreenCacheID(esriViewDrawPhase.esriViewGraphics, null));
}

1
[ESRI 문서는 설명이 아니라고 생각합니다.] [1] [1] : gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz

1
디스플레이 ( esriScreenCache.esriNoScreenCache)에 직접 그리기 때문에 전혀 새로 고칠 필요가 없습니다. 실제로 새로 고침하면 그래픽이 사라집니다. 당신은 PartialRefresh라인 없이 시도 했습니까 ?
blah238

esriViewAll 대신 esriViewDrawPhase.esriViewGeography를 사용해보십시오
patrick

@ blah238 (부분) 새로 고침없이 표시되지 않습니다.
gumo

@iterationx 모든 값을 테스트했지만 esriViewAll나 에게만 효과가있었습니다.
gumo

답변:


5

IScreenDisplay.InValidate 호출 하고 IActiveView.ScreenCacheID 사용하여 esriViewGraphics에 대한 cacheID를 전달하려고 합니다. 맵을 IGraphicsContainer로 캐스트하고 AddElement를 통해 추가하여 그래픽을 맵에 추가 한 후에이 작업을 수행하십시오.


1
고마워요. 나는 Invalidate()막지 않은 레이어와 함께 사용할 수 있다는 것을 몰랐습니다. 구현 세부 사항은 내 업데이트를 참조하십시오.
gumo

1

단계를 확인해야합니다. esriViewDrawPhase .esriViewGraphics가 트릭을 수행 할 것이라고 생각 합니다. 그러나 위상을 비트 단위 OR과 결합 할 수도 있습니다.

http://help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/index.html#/PartialRefresh_Method/0012000001nm000000/


1
또한 envelope인수를 사용하여 새로 고쳐야 할 영역을 추가로 제한 할 수 있습니다.
Petr Krebs

제이도 esriViewGraphics처음 생각했지만 작동하지 않습니다. 그래서 다른 모든 DrapPhases를 시도 esriViewAll하고 다각형 만 표시하고 모든 레이어를 다시로드합니다.
gumo

고마워 Petr, feature.Extent두 번째 인수로 사용 하는 것을 의미 합니다. 나는 성공하지 않고 그것을 시도했다. 나는 그것이 올바른 DrawPhase의 문제이거나 내가 모르는 완전히 다른 접근법이 있다고 생각합니다.
gumo

@ gumo : 방금 arcengine 태그를 발견했습니다. ArcEngine에 익숙하지 않거나 화면 동작에 차이가있을 수 있습니다. ArcEngine 관련 답변이 표시되는 경우이 질문을 삭제합니다.
Jay Cummins 2012 년

1
StartDrawing 및 FinishDrawing 호출이 있습니까?
Jay Cummins 2012 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.