2012-03-17 12 views
7

आकार बदलने वर्तमान में मैं मैं क्या सोचा एक सरल काम होगा करने के लिए कोशिश कर रहा हूँ कलाकृतियों देता है। (कृपया पल के लिए उपेक्षा है कि मैं BackgroundImage property इस्तेमाल कर सकते हैं) इस तरह दिखता आकर्षित करने के लिएएक पैनल नियंत्रण पर एक छवि आकर्षित जब

छवि:

enter image description here

अर्थात एक पिक्सेल ब्लू फ्रेम के साथ एक पीला बॉक्स।

आकर्षित करने के लिए, मैं Panel नियंत्रण से Paint घटना का उपयोग कर रहा:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawImage(Resources.MyImage, panel1.ClientRectangle); 
} 

यह जब शुरू में प्रपत्र प्रदर्शित ठीक लग रहा है:

enter image description here

जब प्रपत्र का आकार बदलने (और डॉक पैनल भी), यह छोटे होने पर किनारों को काटता है ...

enter image description here

... या यह कलाकृतियों ले जाती है, जब बड़े प्रयास किए जा:

enter image description here

मैं बहुत यकीन है कि वहाँ नहीं बल्कि सरल और सीधी-सपाट, लेकिन मैं वास्तव में नहीं समझ सकता कुछ चल रहा है कर रहा हूँ कारण।

चूंकि मैं ClipRectangle को अनदेखा कर रहा हूं और हमेशा सब कुछ खींचता हूं, मैंने सोचा कि छवि हर समय स्केल की जाएगी।

मेरे प्रश्न हैं:

  • कलाकृतियों के लिए क्या कारण है? (I प्यार इसे समझने के लिए!)
  • कलाकृतियों से छुटकारा पाने के लिए मुझे क्या करना है? (प्रत्येक आकार पर Invalidate बुला बगल में)

अद्यतन, समाधान:Ryan's answer को

धन्यवाद, मैं एक स्वीकार्य समाधान खोजने के लिए सक्षम था। असल में मैंने Panel से एक कक्षा प्राप्त की, OnPaintBackground का ओवरराइड किया और आधार विधि को कॉल किया। पिछले है, मैं अपने व्युत्पन्न पैनल के निर्माता के लिए निम्न कोड कहा:

base.DoubleBuffered = true; 

SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
SetStyle(ControlStyles.ResizeRedraw, true); 
SetStyle(ControlStyles.UserPaint, true); 
SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

UpdateStyles(); 
+1

http://stackoverflow.com/questions/1970196/c-sharp-panel-backgroundimage-transparent-controls-flickering – ionden

उत्तर

4

कलाकृतियों के लिए कारण यह है कि पूरी सतह दोबारा बनाई जब प्रपत्र का आकार बदलने पर नहीं है, केवल आवश्यक भागों हैं। आम तौर पर सबसे अच्छा समाधान वह है जो आप नहीं करना चाहते हैं, प्रत्येक आकार पर Invalidate पर कॉल करना। हालांकि, अगर यह वास्तव में आपकी स्थिति है, तो इसके बजाय बस PictureBox का उपयोग करें।यदि ऐसा नहीं है, तो आप इसके बजाय अपने फॉर्म में OnPaint ओवरराइड करने पर विचार कर सकते हैं, और इसे स्वचालित रूप से करने के लिए this.SetStyle(ControlStyles.ResizeRedraw, true) का उपयोग कर सकते हैं।

+0

संभवतः डुप्लिकेट 'अमान्य' कॉल करते समय झटके को कम करने का कोई मौका? (मुझे लगता है कि यह पृष्ठभूमि पहले से खींचा जा रहा है) शायद पृष्ठभूमि ड्राइंग/भरने की बारी? –

+2

@UweKeim: आपको डबल-बफरिंग सक्षम करने की आवश्यकता होगी; उपclass 'पैनल', 'पेंट' को संभालने के बजाय 'OnPaint' का उपयोग करें, और' DoubleBuffered' प्रॉपर्टी को 'true' पर सेट करें। – Ryan

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