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


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.