2012-06-25 5 views
6

to był ciągły problem ze mną, próbowałem zrobić niestandardową narysowaną formę z ładną przejrzystością.Jak mogę zmniejszyć migotanie aktualizacji mojego WinForm True Transparency? czy jest lepszy sposób to zrobić?

to jest tak blisko, jak mogę dostać teraz zacząłem go zaledwie pół godziny temu ..

Edit: robię wzorów formularzy niestandardowych i kontroli od podstaw, jak mój ostatni, Sunilla http://i.stack.imgur.com/rqvDe.png. i chciałem mieć na nim dobry cień, albo zrobić inny projekt, który wygląda trochę jak Windows Areo.

ustawia wartość form.opacity na 0%, a następnie przechwytuje obraz ekranu (wszystko na ekranie, bieżące uruchomione programy, pulpit itp.) Bezpośrednio za formularzem co 500 milisekund od teraz i ustawia go jako tło i przywraca przejrzystość do 100%. więc mogę narysować cokolwiek na nim i wygląda idealnie! ale jedynym problemem, jaki dostaję, jest to, że działa, migocze. i tak, wypróbowałem to z ustawieniem DoubleBuffering na true, bez różnicy.

słyszy główny kod:

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

uwaga: ExtDrawing2D jest oddzielna klasa, która robi dużo ciężkiej pracy z rysunku prawie idealny zakręty. I nie jest to problem, opracowałem go pół roku temu i we wszystkich moich projektach nigdy nie miałem z tym problemów.

wynik:

jeśli istnieje lepszy sposób kłujący w tym ogólnym problemem, id chętnie uwielbiam to słyszeć, chociaż Szukałem po internecie za długa czas.

+0

Hmmm, podwójne buforowanie zazwyczaj rozwiązuje moje problemy z migotaniem. Czy to możliwe, że po InitializeComponent DoubleBuffered w jakiś sposób przywraca się do wartości false? – kmarks2

+0

Czy pomocna jest jedna z nieocenionych sugestii @HansPassant w jego odpowiedzi http://stackoverflow.com/questions/2612487/how-to-fix-the-flickering-in-user-controls? Naprawiono migotanie z moim formularzem i obrazem tła. Głupie pytanie, ale czy tylko sprawienie, by tło Twojej głównej formy było przezroczyste za pośrednictwem Web Colors, osiągnęło coś podobnego? – dash

+0

@ kmarks2 właśnie próbował dodać go po init() i nie jest to podwójne buforowanie, które jest problemem, myślę, że jego forma znika na ułamek sekundy. jeśli istnieje sposób, że mogę dostać ekran zza formularza bez konieczności "ukrywania" go, to zatrzymałoby migotanie. – awhite92

Odpowiedz

1

Wypróbowałem twój kod, ponieważ nie mogłem dowiedzieć się, co próbujesz osiągnąć, i tak, to dużo migocze. Ale dzieje się tak, ponieważ ustawiasz krycie na 0 i z powrotem na 1 co pół sekundy. Jeśli wygląda na to, że próbujesz symulować przezroczyste okno. Dlaczego nie po prostu użyć przezroczystego okna? to znaczy. FormBorderStyle = Brak i ustaw opcje BackColor i TransparencyKey na ten sam kolor (np. Czerwony).

+0

tak to, co im próbuję zrobić lol.but to nie będzie działać poprawnie. Powodem jest to, że chcę narysować cokolwiek na formularzu, jak półprzezroczyste elementy i ewentualnie cień. i nie możesz użyć wygładzania, jeśli użyjesz metody transparencyKey, wszystko kończy się częścią części przezroczystego koloru w półprzezroczystych częściach. – awhite92

+0

i faktycznie używam tej metody TransparencyKey dla moich innych niestandardowych formularzy http://i.stack.imgur.com/rqvDe.png, ale twoja lewa z ostrymi narożnikami i bez cienia. (Nienawidzę cienia "toolTip"). – awhite92

+0

Czy próbowałeś spojrzeć na WPF. Jest świetny dla okrągłych granic, cieni itp. – Michael

Powiązane problemy