淡化面板 – Windows窗体

我有一个可以显示或隐藏的详细信息面板。

如何显示/隐藏该面板(当然还有其内容)的简单淡入淡出效果?

我正在使用Windows窗体,并且控件在Windows窗体中没有opacity属性。

这在Winforms中非常可行,它只需看起来像一个淡入淡出。 一种技术是使用Control.DrawToBitmap()来创建控件的位图。 然后使用计时器从背景位图混合到前景位图。

我将使用UserControl而不是Panel,因此您可以使用Winforms设计器设计控件。 然而,该代码可用于任何类型的控制。 在项目中添加一个新类并粘贴下面显示的代码。 编译。 使用Project + Add New Item,Windows Forms节点,“inheritance的用户控件”模板,从弹出列表中选择FadeControl,从这个创建自己的UserControl。 正常设计用户控件。

如上所述,只要将控件添加到父控件,控件就会自动从父级的BackColor淡出到控件内容。 调用FadeOut()使其混合回背景。 如果要在控件完成淡入淡出时自动处理,则传递true。 您可以使用FadeIn()和Faded属性手动控制淡入淡出。 您可以调整使用// tweakable注释的行中的数字来调整动画。 如果父级具有非不透明背景,则需要执行其他工作。

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