2012-06-25 19 views
6

esto ha sido un problema continuo conmigo, he estado tratando de hacer un formulario personalizado con buena transparencia.¿Cómo puedo reducir el parpadeo en las actualizaciones de mi True Transparency WinForm? o hay una mejor manera de hacer esto?

esto es lo más cerca que puedo conseguir en este momento, lo empecé hace apenas una media hora ..

Editar: hago diseños de formularios personalizados y controles a partir de cero, como mi última, Sunilla http://i.stack.imgur.com/rqvDe.png. y quería tener una buena sombra, o hacer otro diseño que se pareciese a windows areo.

establece el form.opacity al 0% y luego toma una imagen de la pantalla (cualquier cosa en la pantalla, programas actuales, escritorio, etc.) directamente detrás del formulario cada 500 milisegundos a partir de ahora, y lo configura como el fondo y devuelve la transparencia al 100%. así que puedo dibujar cualquier cosa y se ve perfecto! pero el único problema que tengo es que cuando hace el trabajo, parpadea. y sí, lo probé con DoubleBuffering configurado en true, no hay diferencia.

oye el código principal:

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

nota: la ExtDrawing2D es una clase separada que hace mucho del trabajo pesado con el dibujo de las esquinas redondas casi perfectas. Y no es el problema, lo desarrollé hace medio año y en todos mis proyectos nunca tuve problemas con él.

resultado:

si hay una mejor manera de apuñalar a este problema global, con mucho gusto Identificación del encantaría escucharlo, Altho que he estado buscando en la web desde hace mucho hora.

+0

Hmmm, el doble buffer generalmente resuelve mis problemas de parpadeo. ¿Es posible que después de InitializeComponent DoubleBuffered se vuelva a establecer de nuevo en falso? – kmarks2

+0

¿Alguna de las inestimables sugerencias de @HansPassant en su respuesta http://stackoverflow.com/questions/2612487/how-to-fix-the-flickering-in-user-controls ayuda? Se arregló un problema de parpadeo con mi forma y mi imagen de fondo. Pregunta tonta, pero ¿el hecho de hacer que el fondo de su forma principal sea transparente a través de los colores Web logra algo similar? – dash

+0

@ kmarks2 acaba de intentar agregarlo después de init() y no es el doble buffer que es el problema, creo que es que la forma desaparece por una fracción de segundo. si hay una manera de que pueda obtener la pantalla desde detrás del formulario sin tener que "ocultarlo", se detendría el parpadeo. – awhite92

Respuesta

1

Probé tu código porque no pude entender lo que intentabas lograr, y sí parpadea mucho. Pero esto se debe a que está configurando la opacidad a 0 y volviendo a 1 cada medio segundo. Si parece que estás tratando de simular una ventana transparente. ¿Por qué no usar una ventana transparente? es decir. FormBorderStyle = None y establece BackColor y TransparencyKey en el mismo color (por ejemplo, rojo).

+0

sí, eso es lo que estoy tratando de hacer jajaja. Pero no funcionará correctamente. el motivo es porque quiero dibujar cualquier cosa en el formulario, como elementos semitransparentes y posiblemente una sombra paralela. y no puede tener anti-aliasing si usa el método transparentKey, todo termina teniendo parte del color transparentKey en las partes semitransparentes. – awhite92

+0

y de hecho uso ese método TransparencyKey para mis otros formularios personalizados http://i.stack.imgur.com/rqvDe.png pero su izquierda con esquinas agudas y sin sombras. (odio el truco de la sombra 'toolTip'). – awhite92

+0

Ha intentado mirar WPF. Es ideal para bordes redondos, sombras, etc. – Michael

Cuestiones relacionadas