我创建我的应用程序的CustomButton控制。 现在,我想这样做,当鼠标上的按钮它应该显示发光效果,当鼠标离开它应该回到正常的。 但发光效果应该不会立即显示出来。 它应与动画显示。 就像Chrome浏览器分页页面 。 我曾尝试在按钮控制这个逻辑。
这是我的逻辑。 但是,我认为这不是一个正确的方式。 请提出适当的方式获得辉光效果。
private void ShowGlow()
{
for (int i = 0; i<50; i+= 5)
{
Sleep(100);
Graphics g = this.CreateGraphics();
Color color = Color.FromArgb(i, 150,150,25);
g.FillRectangle(new SolidBrush(color), this.ClientRectangle);
}
}
其他详细信息的Visual Studio 2005,Windows XP和Windows窗体控件
我建议你一个简单的方法。 创建两个图像,具有发光效果和无。 并使用此代码。
上的MouseEnter:
private void MyButton_MouseEnter(object sender, EventArgs e)
{
MyButton.BackgroundImage = Properties.Resources.WithGlow;
}
在鼠标离开:
private void MyButton_MouseLeave(object sender, EventArgs e)
{
MyButton.BackgroundImage = Properties.Resources.WithoutGlow;
}
这是我平时在我的项目做。
下面是一个使用定时器和覆盖OnPaint方法的一些代码。 它跳过了10,而不是1,因为我怕你不会看到效果的速度不够快,否则。 计时器间隔以毫秒为单位,并设定为100,因为这是你在使用睡眠您的原来的例子是什么。 如果你需要的效果,以提高工作效率,可以减少间隔。 如果它应该会比较慢,你可以增加间隔时间,或减少多少增加阿尔法与每个刻度。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LicensePlate
{
/// <summary>
/// The GlowButton class
/// </summary>
public class GlowButton : Button
{
#region Fields
Timer timer;
private int alpha;
Color color;
#endregion
#region Events
#endregion
#region Constructor
/// <summary>
/// Creates a new instance of the GlowButton class.
/// </summary>
public GlowButton()
{
timer = new Timer();
timer.Interval = 100;
timer.Tick += timer_Tick;
}
#endregion
#region Methods
/// <summary>
/// Only used if you need something else to trigger the glow process
/// </summary>
private void ShowGlow()
{
timer.Start();
}
/// <summary>
/// Start the timer and reset glow if the mouse enters
/// </summary>
/// <param name="e"></param>
protected override void OnMouseEnter(EventArgs e)
{
timer.Start();
alpha = 0;
}
/// <summary>
/// Reset the glow when the mouse leaves
/// </summary>
/// <param name="e"></param>
protected override void OnMouseLeave(EventArgs e)
{
timer.Stop();
alpha = 0;
color = BackColor;
Invalidate();
}
/// <summary>
/// Override paint so that it uses your glow regardless of when it is instructed to draw
/// </summary>
/// <param name="pevent"></param>
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
if (alpha > 0)
{
using (Brush b = new SolidBrush(color))
{
pevent.Graphics.FillRectangle(b, this.ClientRectangle);
}
}
//base.OnPaint(pevent);
}
/// <summary>
/// Use a timer tick to set the color and increment alpha
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void timer_Tick(object sender, EventArgs e)
{
alpha+=10;
color = Color.FromArgb(alpha, 150, 150, 25);
if (alpha > 50) {
timer.Stop();
}
Invalidate();
}
#endregion
}
}