ग्राफिक्स ड्राइंग के बाद दृश्य को ताज़ा करने का सबसे अच्छा तरीका क्या है?


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लेकिन उनमें से कोई भी नया बहुभुज नहीं दिखा।

वहाँ के साथ redraw की तुलना में एक बेहतर उपाय है esriViewDrawPhase.esriViewAll?

अपडेट करें

मैं एक प्रयोग किया जाता ILayerExtensionDraw.AfterDrawड्रा चरणों का परीक्षण करने और AfterDraw के लिए ही हिट हो जाता है PartialRefresh()के साथ esriViewAll। विस्तार MapControl.Layers में सभी परतों में जोड़ा गया है। मुझे उम्मीद थी कि यह हर बार हिट हो जाता है? किस लेयर पर mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);ड्रॉ होता है ताकि आफ्टरव्रा भी बढ़ा न हो?

उत्तर

कर्क के लिए धन्यवाद यहां समाधान है, जो किसी भी परत को फिर से लोड किए बिना नए जोड़े गए ग्राफिक को दिखाता है।

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
चैज़

1
चूंकि आप सीधे प्रदर्शन ( esriScreenCache.esriNoScreenCache) के लिए आकर्षित कर रहे हैं , आपको बिल्कुल भी ताज़ा करने की आवश्यकता नहीं होनी चाहिए। वास्तव में ताज़ा करने से ग्राफ़िक गायब हो जाएगा। क्या आपने बिना PartialRefreshलाइन के कोशिश की है ?
blah238

EsriViewDrawPhase.esriViewGeography बजाय esriViewAll की कोशिश करें
पैट्रिक

@ blah238 यह (आंशिक) ताज़ा किए बिना नहीं दिख रहा है।
गमो

@iterationx मैंने सभी मानों का परीक्षण किया, लेकिन केवल esriViewAllमेरे लिए काम किया।
गमो

जवाबों:


5

मैं IScreenDisplay.InValidate को कॉल करने का प्रयास करूंगा , और IActiveView.ScreenCacheID का उपयोग करके esriViewGraphics के लिए एक कैशआईडी में पास हो जाऊंगा । मैप्स को IGraphicsContainer में मैप करके, और AddElement के माध्यम से जोड़कर ग्राफिक्स को जोड़ने के बाद ऐसा करें।


1
धन्यवाद, यह काम करता है। मुझे नहीं पता था कि मैं Invalidate()बिना पड़ी परतों के साथ उपयोग कर सकता हूं । कार्यान्वयन विवरण के लिए मेरा अपडेट देखें।
गमो

1

आपको चरणों की जांच करने की आवश्यकता है: मुझे लगता है कि esriViewDrawPhase .esriViewGraphics आपके लिए ट्रिक करेगा। लेकिन आप चरणों को एक बिटवाइस या के साथ जोड़ सकते हैं।

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


1
इसके अलावा, कोई भी envelopeउस क्षेत्र को प्रतिबंधित करने के लिए तर्क का उपयोग कर सकता है जिसे ताज़ा किया जाना चाहिए।
पेट्र क्रेब्स

जय, esriViewGraphicsमेरा पहला विचार भी था, लेकिन यह काम नहीं करता है। इसलिए मैंने अन्य सभी ड्रेपेज़ की कोशिश की और केवल esriViewAllबहुभुज दिखाता है लेकिन सभी परतों को फिर से लोड करता है।
गमो

धन्यवाद पेट्र, मुझे लगता है कि आप feature.Extentदूसरे तर्क के रूप में उपयोग करते हैं । मैंने कोशिश की कि कोई सफलता न मिले। मुझे लगता है कि यह सही ड्रापेज़ का सवाल है या शायद एक पूरी तरह से अलग दृष्टिकोण है जो मुझे नहीं पता है।
गमो

@gumo: बस आर्केंगाइन टैग पर ध्यान दिया गया। मैं ArcEngine से परिचित नहीं हूँ या यह स्क्रीन व्यवहार (शायद यह अलग है)। मैं इस प्रश्न को हटा दूंगा यदि / जब ArcEngine- विशिष्ट उत्तर दिखाई देते हैं।
जे कमिंस

1
क्या आपके पास StartDrawing और FinishDrawing कॉल हैं?
जे कमिंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.