2010-02-18 9 views
19

मेरे पास कोड है जो Winforms में एक सीमाहीन रूप के चारों ओर खींचने देता है जिसे मैं कई महीनों से उपयोग कर रहा हूं, जो बहुत अच्छी तरह से काम करता है।अमान्य बनाम अद्यतन

लेकिन जब मुझे पहली बार कोड दिया गया, तो उन्होंने फॉर्म के MouseMove घटना में this.Invalidate(); का उपयोग किया, और फॉर्म थोड़ी फ्लिकर हो गया और चारों ओर खींचते समय धीमा हो गया। इसलिए, MouseMove घटना में Update() के साथ प्रतिस्थापित किया गया और, मेरे आश्चर्य के लिए, फ़ॉर्म को अब बहुत आसानी से खींचा जा सकता है और इसमें कोई फर्क नहीं पड़ता है।

क्या कोई मुझे बता सकता है कि क्यों अपडेट कोड को अमान्य से बेहतर बनाता है, भले ही अमान्य लगता है कि यह सही उपयोग करने वाला है?

धन्यवाद :)

पी.एस. अगर मैं कोड जोड़ता हूं तो शायद यह और मदद करेगा ... इसे अभी जोड़ना।

संपादित - कोड यह रहा:


private void titlebar_MouseDown(object sender, MouseEventArgs e) 
{ 
    this.IsMouseDown = true; 

    this.LastCursorPosition = new Point(e.X, e.Y); 

    if (this.BackColor == Color.White) 
    { 
     this.BackColor = Color.GhostWhite; 
     tbox.BackColor = Color.GhostWhite; 
     tbox.ForeColor = Color.Black; 
    } 
    else 
    { 
     this.BackColor = Color.FromArgb(20, 20, 20); 
     tbox.BackColor = Color.FromArgb(20, 20, 20); 
     tbox.ForeColor = Color.White; 
    } 
} 

private void titlebar_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (this.IsMouseDown == true) 
    { 
     //Move the form 
     this.Location = new Point(this.Left - (this.LastCursorPosition.X - e.X), this.Top - (this.LastCursorPosition.Y - e.Y)); 

     // Update works better than Invalidate();. 
     Update(); 
    } 
} 

private void titlebar_MouseUp(object sender, MouseEventArgs e) 
{ 
    this.IsMouseDown = false; 
    this.BackColor = fc; 
    tbox.BackColor = fc; 
} 

उत्तर

12

अमान्य (कुछ बिंदु पर) ताज़ा करने की आवश्यकता होगी, के रूप में खिड़की के निशान। अद्यतन वहाँ और फिर यह होता है अगर मैं सही ढंग से याद

यहाँ एक link अंतर बेहतर समझाने के लिए की तुलना में मैं करने के लिए

+2

धन्यवाद एक गुच्छा मार्टिन। :) –

31

Invalidate() बस एक क्षेत्र कहते हैं नियंत्रण से अद्यतन क्षेत्र के लिए सक्षम होगा है। अगली बार WM_PAINT प्राप्त होता है, जिस क्षेत्र को आपने अवैध किया है, साथ ही किसी भी अन्य अमान्य क्षेत्रों को चित्रकला के लिए चिह्नित किया गया है। जब RedrawWindow() कहा जाता है, तो आमतौर पर एप्लिकेशन कतार में WM_PAINT संदेश पोस्ट करेगा। यह प्रणाली उस चीज को करने के लिए स्वतंत्र है जो वह चाहती है, आम तौर पर अधिक दबाव वाले व्यवसाय, और जब यह कर सकती है तो पेंट करें। GDI + के UpdateWindow() जो repainting के लिए कोई क्षेत्र चिह्नित नहीं होगा, लेकिन WNDPROC() करने के लिए एक WM_PAINT सीधे धक्का, आवेदन कतार दरकिनार

आप Update() फोन हैं, तो आप मिलता है।

आप एक नियंत्रण की एक तत्काल ताज़ा जरूरत हैं, तो Refresh() है, जो तब क्षेत्र को अमान्य कर तुरंत Update() कॉल का उपयोग करें।

+0

मुझे एहसास है कि यह एक पुरानी पोस्ट है और शायद इसे एक अलग प्रश्न के रूप में पोस्ट किया जाना चाहिए, लेकिन जब आप अपडेट का उपयोग करेंगे और जब आप रीफ्रेश का उपयोग करेंगे तो मैं स्पष्ट नहीं हूं। ऐसा लगता है कि दोनों बल तत्काल पश्चाताप करते हैं। क्या आप स्पष्टीकरण में सक्षम हैं? धन्यवाद! –

+4

@AdamPlocher विधि टिप्पणियों से यह दिखाई देगा कि 'अमान्य() 'चित्रकला की आवश्यकता के रूप में क्षेत्र को झुकाता है, लेकिन यह आवश्यक रूप से पेंट नहीं करता है। 'अद्यतन() 'किसी भी वर्तमान में अमान्य क्षेत्रों को पुनर्निर्मित करने के लिए मजबूर करता है, लेकिन कुछ भी ध्वजांकित नहीं करता है। और 'रीफ्रेश()' दो संचालन को एक साथ लपेटता है, पहले नियंत्रण के क्षेत्र को अमान्य के रूप में फ़्लैग करता है और फिर तुरंत क्षेत्र का अनुरोध (अद्यतन) किया जाता है। ** संपादित करें: ** http://stackoverflow.com/a/952964/1718702 – HodlDwon

संबंधित मुद्दे