2012-06-25 10 views
6

यह मेरे साथ एक चल रही समस्या रही है, मैं अच्छी पारदर्शिता के साथ कस्टम तैयार फॉर्म बनाने की कोशिश कर रहा हूं।मैं अपने ट्रू पारदर्शिता WinForm के अपडेट पर झटके को कैसे कम कर सकता हूं? या ऐसा करने का एक बेहतर तरीका है?

इस रूप में करीब है के रूप में मैं अभी प्राप्त कर सकते हैं, मैं यह सिर्फ एक आधे घंटे पहले शुरू ..

संपादित करें: मैं खरोंच से कस्टम प्रपत्र डिजाइन और नियंत्रण बनाने के लिए, मेरा नवीनतम की तरह, सुनीला http://i.stack.imgur.com/rqvDe.png। और मैं उस पर एक अच्छी बूंद छाया रखना चाहता था, या एक और डिज़ाइन जो विंडोज़ इरो की तरह दिखता है।

यह फॉर्म.ऑसिटी 0% पर सेट करता है, फिर यह स्क्रीन की एक छवि (स्क्रीन पर कुछ भी, वर्तमान चल रहे प्रोग्राम, डेस्कटॉप इत्यादि) को सीधे 500 मिलीसेकंड के रूप में सीधे फॉर्म के पीछे पकड़ता है, और इसे सेट करता है पृष्ठभूमि और पारदर्शिता वापस 100% लाता है। इसलिए मैं उस पर कुछ भी खींच सकता हूं और यह सही दिखता है! लेकिन जब मैं काम करता हूं, तो यह एकमात्र समस्या है, यह झिलमिलाहट करता है। और हाँ मैंने इसे डबलबफरिंग सेट के साथ सही करने की कोशिश की, कोई फर्क नहीं पड़ता।

सुनता मुख्य कोड:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace TTTest 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

      Opacity = 100; 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      timer1.Enabled = !timer1.Enabled; 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 

      Opacity = 0; 
      Bitmap img = new Bitmap(this.Width, this.Height); 
      Graphics gr = Graphics.FromImage(img); 
      gr.CopyFromScreen(Location, Point.Empty, Size); 
      this.BackgroundImage = img; 
      Opacity = 100; 
     } 

     private void Form1_Paint(object sender, PaintEventArgs e) 
     { 
      Graphics g = e.Graphics; 
      g.SmoothingMode = SmoothingMode.AntiAlias; 

      ExtDrawing2D.FillRoundRect(g, new SolidBrush(Color.FromArgb(100, 255, 255, 255)), new RectangleF(1, 1, Width - 3, Height - 3), 4f); 
      g.DrawPath(new Pen(Color.FromArgb(100, 0, 0, 0)), ExtDrawing2D.GetRoundedRect(new RectangleF(0, 0, Width - 1, Height - 1), 5f)); 
      g.DrawPath(new Pen(Color.FromArgb(100, 255,255,255)), ExtDrawing2D.GetRoundedRect(new RectangleF(1,1, Width - 3, Height - 3), 4f)); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      timer1_Tick(sender, e); 
     } 

     private void panel1_Paint(object sender, PaintEventArgs e) 
     { 
      Graphics g = e.Graphics; 
      g.SmoothingMode = SmoothingMode.AntiAlias; 

      ExtDrawing2D.FillRoundRect(g, new SolidBrush(Color.FromArgb(150, 255,255,255)), new RectangleF(1, 1, panel1.Width - 3, panel1.Height - 3), 2f); 
      g.DrawPath(new Pen(Color.FromArgb(100, 0, 0, 0)), ExtDrawing2D.GetRoundedRect(new RectangleF(0, 0, panel1.Width - 1, panel1.Height - 1), 3f)); 
      g.DrawPath(new Pen(Color.FromArgb(100, 255, 255, 255)), ExtDrawing2D.GetRoundedRect(new RectangleF(1, 1, panel1.Width - 3, panel1.Height - 3), 2f)); 
     } 
    } 
} 

ध्यान दें: ExtDrawing2D एक अलग वर्ग है कि लगभग पूर्ण दौर कोनों ड्राइंग के साथ भारी बहुत काम करता है। और यह समस्या नहीं है, मैंने इसे आधे साल पहले विकसित किया था और मेरी सभी परियोजनाओं में इसके साथ कभी समस्या नहीं थी।

परिणाम:

अगर वहाँ इस समग्र समस्या पर चोट पहुंचा रहा का एक बेहतर तरीका है, आईडी ख़ुशी से, यह जानकर बहुत खुशी हालांकि मैं एक लंबे समय के लिए वेब चारों ओर देख रहा है पहर।

+0

हम्म, डबल बफरिंग आमतौर पर मेरी झटकेदार समस्याओं को हल करती है। क्या यह संभव है कि प्रारंभिक के बाद कॉम्पोनेंट डबलबफर्ड किसी भी तरह झूठी पर वापस आ रहा है? – kmarks2

+0

क्या उनके जवाब में किसी भी अचूक @ हंसपैसेंट सुझावों में से कोई भी http://stackoverflow.com/questions/2612487/how-to-fix-the-flickering-in-user-controls मदद करता है? यह मेरे रूप और पृष्ठभूमि छवि के साथ एक झटकेदार मुद्दा तय किया। मूर्ख सवाल, लेकिन क्या वेब रंगों के माध्यम से पारदर्शी आपके मुख्य रूप की पृष्ठभूमि को कुछ समान बनाते हैं? – dash

+0

@ kmarks2 ने अभी init() के बाद इसे जोड़ने का प्रयास किया है और यह समस्या नहीं है कि डबल बफरिंग, मुझे लगता है कि यह फ़ॉर्म एक दूसरे के लिए गायब हो जाता है। यदि कोई तरीका है तो मैं इसे "छिपाने" के बिना स्क्रीन के पीछे से स्क्रीन प्राप्त कर सकता हूं, यह झटके को रोक देगा। – awhite92

उत्तर

1

मैंने आपके कोड की कोशिश की क्योंकि मैं यह नहीं समझ पाया कि आप क्या हासिल करने की कोशिश कर रहे थे, और हाँ यह बहुत झटकेदार है। लेकिन ऐसा इसलिए है क्योंकि आप अस्पष्टता 0 पर सेट कर रहे हैं और प्रति आधे सेकेंड में 1 पर वापस आ रहे हैं। ऐसा लगता है कि आप एक पारदर्शी विंडो अनुकरण करने की कोशिश कर रहे हैं। एक पारदर्शी खिड़की का उपयोग क्यों न करें? अर्थात। FormBorderStyle = कोई नहीं और बैककोलर और ट्रांसपेरेंसीकी को उसी रंग में सेट करें (उदाहरण के लिए लाल)।

+0

हां, जो मैं lol करने की कोशिश कर रहा हूँ। लेकिन यह सही काम नहीं करेगा। कारण यह है कि, क्योंकि मैं फॉर्म पर कुछ भी आकर्षित करना चाहता हूं, जैसे सेमी-पारदर्शी तत्व, और संभवतः एक ड्रॉप छाया। और यदि आप पारदर्शिता कुंजी विधि का उपयोग करते हैं तो एंटी-एलाइजिंग नहीं हो सकती है, अर्ध-पारदर्शी हिस्सों में पारदर्शिता के रंग का हिस्सा होने पर सब कुछ समाप्त होता है। – awhite92

+0

और मैं वास्तव में अपने अन्य कस्टम रूपों के लिए TransparencyKey विधि का उपयोग करता हूं http://i.stack.imgur.com/rqvDe.png लेकिन तेज बाएं और कोई छाया के साथ आपका बायां। (मुझे 'टूलटिप' छाया हैक से नफरत है)। – awhite92

+0

क्या आपने WPF को देखने का प्रयास किया है। यह गोल सीमाओं, छाया, आदि के लिए बहुत अच्छा है – Michael