2009-06-11 14 views
5

मैं और आयत बनाकर कर रहा हूँ, कुछ मिलीसेकंड के लिए सो - तो मैं आयत साफ़ करना चाहते हैं, लेकिन मैं कैसे को समझ नहीं सकता। (आयत एक ग्राफिक के ऊपर बैठा है तो मैं बस इसे कवर नहीं कर सकते हैं एक और आयत के साथ)क्लियरिंग DrawRectangle फॉर्म्स

   graphics.DrawRectangle(p, innerRectangle) 
       System.Threading.Thread.Sleep(75) 
       Next I want to clear the rectange... 

उत्तर

5

आप ग्राफिक पुनः बनाने का (या आयत के तहत इसके बारे में कम से कम हिस्सा) की जरूरत है। इस एक तस्वीर बॉक्स या कुछ इसी तरह है, तो Invaldiate() का प्रयोग कर एक रीपेंट मजबूर करने के लिए।

2

मुझे लगता है कि आयत को चित्रित करने से पहले इसे मूल डेटा को अस्थायी बिटमैप में कॉपी करने के लिए काम करना चाहिए, और उसके बाद बिटमैप को वापस जगह पर खींचें।

अद्यतन

वहां पहले से ही एक स्वीकृत जवाब है, लेकिन मैंने सोचा कि मैं एक कोड नमूना वैसे भी साझा कर सकता। यह एक दिया नियंत्रण पर लाल रंग में दिया आयत ड्रॉ, और 500 एमएस के बाद क्षेत्र पुनर्स्थापित करता है।

public void ShowRectangleBriefly(Control ctl, Rectangle rect) 
{ 
    Image toRestore = DrawRectangle(ctl, rect); 
    ThreadPool.QueueUserWorkItem((WaitCallback)delegate 
    { 
     Thread.Sleep(500); 
     this.Invoke(new Action<Control, Rectangle, Image>(RestoreBackground), ctl, rect, toRestore); 
    }); 
} 

private void RestoreBackground(Control ctl, Rectangle rect, Image image) 
{ 
    using (Graphics g = ctl.CreateGraphics()) 
    { 
     g.DrawImage(image, rect.Top, rect.Left, image.Width, image.Height); 
    } 
    image.Dispose(); 
} 

private Image DrawRectangle(Control ctl, Rectangle rect) 
{ 
    Bitmap tempBmp = new Bitmap(rect.Width + 1, rect.Height + 1); 
    using (Graphics g = Graphics.FromImage(tempBmp)) 
    { 
     g.CopyFromScreen(ctl.PointToScreen(new Point(rect.Top, rect.Left)), new Point(0, 0), tempBmp.Size); 
    } 

    using (Graphics g = this.CreateGraphics()) 
    { 
     g.DrawRectangle(Pens.Red, rect); 
    } 
    return tempBmp; 
} 
2

आयत पूरी तरह से ग्राफिक से अधिक बैठा है, तो आप सिर्फ पुनः बनाने या अंतर्निहित ग्राफिक ताज़ा करने के लिए सक्षम होना चाहिए। यदि ऐसा नहीं है, तो आप आयत पृष्ठभूमि रंग का उपयोग कर पुनः बनाने, और फिर अंतर्निहित ग्राफिक ताज़ा करने के लिए की आवश्यकता होगी।

1

मैं एक ही समस्या थी और मुख्य रूप पर तैयार की और, छिपे हुए आकार से पता चला/और आवश्यक के रूप में तैनात एक अतिरिक्त पैनल के साथ यह संकल्प लिया।

SelectionBox box = new SelectionBox(); 
box.Location = location; 
box.Size = size; 
box.Visible = true; 

फिर जब आयत अब आवश्यक नहीं है, बस इसे फोन करके छिपाने:

box.Visible = false; 

पैनल वर्ग सुनिश्चित करना है कि ओवरले ग्राफिक्स विंडो के अन्य सामग्री छिपा नहीं है पारदर्शिता के साथ किया जाता है।

[System.ComponentModel.DesignerCategory("Code")] 
    public class SelectionBox : Panel 
    { 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     const int penWidth = 2; 
     int offset = penWidth - 1; 
     using (Pen pen = new Pen(Color.Red, 2)) 
     e.Graphics.DrawRectangle(pen, offset, offset, 
      ClientSize.Width - offset - 1, ClientSize.Height - offset - 1); 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
     CreateParams cp = base.CreateParams; 
     cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT 
     return cp; 
     } 
    } 
    } 
+0

जानते हैं कि इस मामले में ओवरले पैनल माउस क्लिक रोकना होगा रहें, ताकि आप अंतर्निहित पैनल के लिए सभी प्रासंगिक घटनाओं को आगे करना चाहिए। –

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