2012-04-16 10 views
6

Ho un pannello di dettagli che può essere mostrato o nascosto.Dissolvenza di un pannello - Moduli di Windows

Come posso creare un semplice effetto di dissolvenza per mostrare/nascondere quel riquadro (e ovviamente il suo contenuto)?

Sto utilizzando i moduli di Windows e i controlli non hanno la proprietà opacity nei moduli di Windows.

+1

sai. il 'pannello' non ha alcuna proprietà' opacity'. non può essere possibile. dovresti usare 'WPF' per farlo! –

+0

Domanda @SteveWong aggiornata. –

+2

Utilizzare invece WPF –

risposta

17

Questo è abbastanza in grado di fare in Winforms, deve solo guardare come una dissolvenza. Una tecnica consiste nell'utilizzare Control.DrawToBitmap() per creare una bitmap del controllo. E quindi si fondono da una bitmap di sfondo alla bitmap in primo piano con un timer.

Userò un UserControl invece di un Pannello in modo da poter progettare il controllo con il progettista Winforms. Il codice funzionerà comunque con qualsiasi tipo di controllo. Aggiungi una nuova classe al tuo progetto e incolla il codice mostrato di seguito. Compilare. Crea il tuo UserControl da questo con Project + Aggiungi nuovo elemento, nodo Windows Form, modello "Controllo degli utenti ereditati" e seleziona FadeControl dall'elenco popup. Progetta il controllo utente normalmente.

Come scritto, il controllo si dissolverà automaticamente dal BackColor del genitore al contenuto del controllo non appena si aggiunge il controllo al genitore. Chiama FadeOut() per farlo fondere sullo sfondo. Passa true se si desidera disporre automaticamente il controllo quando viene eseguito lo sbiadimento. È possibile utilizzare FadeIn() e la proprietà Faded per il controllo manuale della dissolvenza. Puoi regolare i numeri nelle linee commentate con // modificabili per regolare l'animazione. È necessario ulteriore lavoro se il genitore ha uno sfondo non 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; 
}