2012-04-16 15 views
6

Tengo un panel de detalles que se puede mostrar u ocultar.Fundir un panel- Windows formas

¿Cómo puedo hacer un simple efecto de fundido para mostrar u ocultar ese panel (y por supuesto su contenido)?

Estoy usando formularios de Windows, y los controles no tienen la propiedad opacity en los formularios de Windows.

+1

sabes. el 'panel' no tiene ninguna propiedad' opacity'. el no puede ser posible. deberías usar 'WPF' para hacer eso! –

+0

@SteveWong pregunta actualizada. –

+2

Debería usar WPF en su lugar –

Respuesta

17

Esto es bastante factible en Winforms, solo tiene que ver como un fade. Una técnica es usar Control.DrawToBitmap() para crear un mapa de bits del control. Y luego combine desde un mapa de bits de fondo hasta el mapa de bits en primer plano con un temporizador.

Usaré un UserControl en lugar de un Panel para que pueda diseñar el control con el diseñador de Winforms. Sin embargo, el código funcionará en cualquier tipo de control. Agregue una nueva clase a su proyecto y pegue el código que se muestra a continuación. Compilar. Cree su propio UserControl desde este con Project + Add New Item, nodo Windows Forms, plantilla de "Control de usuario heredado" y elija FadeControl de la lista emergente. Diseña el control del usuario de forma normal.

Según está escrito, el control se desvanecerá automáticamente del BackColor del padre al contenido del control tan pronto como agregue el control al padre. Llame a FadeOut() para que se mezcle nuevamente con el fondo. Pase verdadero si desea disponer automáticamente el control cuando se haya agotado. Puede usar FadeIn() y la propiedad Desvanecida para el control manual del desvanecimiento. Puede ajustar los números en las líneas comentadas con // ajustables para ajustar la animación. Se necesita trabajo adicional si el padre tiene un fondo no opaco.

using System; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Windows.Forms; 

class FadeControl : UserControl { 

    public FadeControl() { 
     pbox = new PictureBox(); 
     pbox.BorderStyle = BorderStyle.None; 
     pbox.Paint += new PaintEventHandler(pbox_Paint); 
     fadeTimer = new Timer(); 
     fadeTimer.Interval = 15; // tweakable 
     fadeTimer.Tick += new EventHandler(fadeTimer_Tick); 
    } 

    public bool Faded { 
     get { return blend < 0.5f; } 
    } 
    public void FadeIn() { 
     stopFade(false); 
     createBitmaps(); 
     startFade(1); 
    } 
    public void FadeOut(bool disposeWhenDone) { 
     stopFade(false); 
     createBitmaps(); 
     disposeOnComplete = disposeWhenDone; 
     startFade(-1); 
    } 

    private void createBitmaps() { 
     bmpBack = new Bitmap(this.ClientSize.Width, this.ClientSize.Height); 
     using (var gr = Graphics.FromImage(bmpBack)) gr.Clear(this.Parent.BackColor); 
     bmpFore = new Bitmap(bmpBack.Width, bmpBack.Height); 
     this.DrawToBitmap(bmpFore, this.ClientRectangle); 
    } 
    void fadeTimer_Tick(object sender, EventArgs e) { 
     blend += blendDir * 0.02F; // tweakable 
     bool done = false; 
     if (blend < 0) { done = true; blend = 0; } 
     if (blend > 1) { done = true; blend = 1; } 
     if (done) stopFade(true); 
     else pbox.Invalidate(); 
    } 
    void pbox_Paint(object sender, PaintEventArgs e) { 
     Rectangle rc = new Rectangle(0, 0, pbox.Width, pbox.Height); 
     ColorMatrix cm = new ColorMatrix(); 
     ImageAttributes ia = new ImageAttributes(); 
     cm.Matrix33 = blend; 
     ia.SetColorMatrix(cm); 
     e.Graphics.DrawImage(bmpFore, rc, 0, 0, bmpFore.Width, bmpFore.Height, GraphicsUnit.Pixel, ia); 
     cm.Matrix33 = 1F - blend; 
     ia.SetColorMatrix(cm); 
     e.Graphics.DrawImage(bmpBack, rc, 0, 0, bmpBack.Width, bmpBack.Height, GraphicsUnit.Pixel, ia); 
    } 

    private void stopFade(bool complete) { 
     fadeTimer.Enabled = false; 
     if (complete) { 
      if (!Faded) this.Controls.Remove(pbox); 
      else if (disposeOnComplete) this.Dispose(); 
     } 
     if (bmpBack != null) { bmpBack.Dispose(); bmpBack = null; } 
     if (bmpFore != null) { bmpFore.Dispose(); bmpFore = null; } 
    } 
    private void startFade(int dir) { 
     this.Controls.Add(pbox); 
     this.Controls.SetChildIndex(pbox, 0); 
     blendDir = dir; 
     fadeTimer.Enabled = true; 
     fadeTimer_Tick(this, EventArgs.Empty); 
    } 

    protected override void OnCreateControl() { 
     base.OnCreateControl(); 
     if (!DesignMode) FadeIn(); 
    } 
    protected override void OnResize(EventArgs eventargs) { 
     pbox.Size = this.ClientSize; 
     base.OnResize(eventargs); 
    } 
    protected override void Dispose(bool disposing) { 
     if (disposing) { 
      stopFade(false); 
      pbox.Dispose(); 
      fadeTimer.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    private PictureBox pbox; 
    private Timer fadeTimer; 
    private Bitmap bmpBack, bmpFore; 
    private float blend; 
    private int blendDir = 1; 
    private bool disposeOnComplete; 
} 
Cuestiones relacionadas