2012-06-25 15 views
6

Bu benim için sürekli bir sorun oldu, güzel şeffaflık ile özel bir çizim formu yapmaya çalışıyorum.Gerçek Şeffaflık WinForm'umdaki güncellemelerdeki titremeyi nasıl azaltabilirim? ya da bunu yapmak için daha iyi bir yolu var mı?

i hemen alabilirsiniz, sadece yarım saat önce başlattığını olarak bu kadar yakın olan

..

Düzenleme: i sıfırdan özel form tasarımları ve kontrolleri yapmak , benim son gibi, Sunilla http://i.stack.imgur.com/rqvDe.png. ve üzerinde iyi bir gölge olmasını istiyordum ya da windows areo gibi görünen başka bir tasarım yapmak istiyordum.

form.opacity değerini% 0 olarak ayarlar, ardından ekranın görüntüsünü (ekran üzerindeki herhangi bir şey, geçerli çalışan programlar, masaüstü, vb.) Hemen her 500 milisaniyeden sonra formun hemen arkasından yakalar ve arka plan ve şeffaflığı% 100'e geri getirir. böylece bir şey çizebilirim ve mükemmel görünüyor! Ama aldığım tek sorun, iş yaptığı zaman, titriyor. ve evet DoubleBuffering ile true, hiçbir fark ayarlamak için çalıştı.

ana kod duyar:

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)); 
     } 
    } 
} 

not: ExtDrawing2D neredeyse mükemmel yuvarlak köşeleri çizim ile ağır bir sürü iş yapar ayrı sınıftır. VE sorun değil, bunu yarım yıl önce geliştirdim ve tüm projelerimde bununla hiç problem yaşamadım.

sonucu: ben uzun web'de etrafa oldum altho

bu genel sorunun en bıçaklama daha iyi bir yolu olup olmadığını, kimlik memnuniyetle, duymayı çok zaman.

+0

Hmmm, çift arabelleğe alma genellikle titreme sorunlarımı çözer. InitializeComponent DoubleBuffered sonra bir şekilde yanlış olarak ayarlanmış olabilir mi? – kmarks2

+0

http://stackoverflow.com/questions/2612487/how-to-fix-the-flickering-in-user-controls yanıtındaki dikkate değer @HansPassant önerilerinden herhangi biri var mı? Formum ve arka plan resmim ile titrek bir sorunu giderdi. Aptalca bir soru, ama sadece ana renklerinizin arka planını Web Renkleri üzerinden şeffaflaştırmak, benzer bir şeye ulaşıyor mu? – dash

+0

@ kmarks2 bunu init() 'den sonra eklemeyi denedi ve sorun değil, çift arabelleğe almayı denedim, bunun formun bir saniyeliğine kaybolacağını düşünüyorum. eğer bir yol varsa, ekranı "gizlemek" zorunda kalmadan formun arkasından alabilirim, titremeyi durdurabilirdi. – awhite92

cevap

1

Kodunuzu denedim çünkü neyi başarmaya çalıştığınızı anlayamadım ve evet çok titriyor. Fakat bunun nedeni, opaklığı 0'a ve saniyede bir 1'e 1'e geri yüklüyorsunuz. Şeffaf bir pencere benzetmeye çalışıyor gibi görünüyor. Neden sadece şeffaf bir pencere kullanmıyorsunuz? yani. FormBorderStyle = Yok ve BackColor ve TransparencyKey'i aynı renge ayarlayın (örn. Kırmızı).

+0

evet, lol yapmaya çalışıyorum. Ama işe yaramayacak. Nedeni, çünkü yarı saydam elemanlar ve muhtemelen bir düşme gölge gibi bir şey çizmek istiyorum. ve transparencyKey Metodu'nu kullanırsanız anti-aliasing yapamazsınız, her şey yarı saydam parçalarda transparencyKey renginin bir parçasına sahip olur. – awhite92

+0

ve aslında diğer özel formlar için TransparencyKey yöntemini kullanıyorum http://i.stack.imgur.com/rqvDe.png ama solda keskin köşeleri ve gölge yok. ('toolTip' gölge hackinden nefret ediyorum). – awhite92

+0

WPF'ye bakmayı denediniz mi? Yuvarlak kenarlıklar, gölgeler, vb. Için harikadır. – Michael

İlgili konular