谁能帮关于创建像在Win7计算器一个winform动画,当你悬停鼠标按钮,目前我使用一堆图像,然后在BackgroundWorker的循环,但我认为它错了,这是我的代码:
发生这种情况时,鼠标输入,
private void bgTurnOn_DoWork(object sender, DoWorkEventArgs e)
{
Label labelSender = (Label)e.Argument;
int ii = labelSender.ImageIndex;
for (int i = ii + 4; i <= 11; i++)
{
if (labelSender.AllowDrop)
{
labelSender.ImageIndex = i;
Thread.Sleep(40);
}
}
}
这时候鼠标离开
private void bgTurnOff_DoWork(object sender, DoWorkEventArgs e)
{
Label labelSender = (Label)e.Argument;
int ii = labelSender.ImageIndex;
for (int i = ii; i >= 0; i--)
{
if (!labelSender.AllowDrop)
{
labelSender.ImageIndex = i;
Thread.Sleep(80);
}
}
}
注意:我只是用的AllowDrop所以我也懒得去申报新的变量,我有42个按钮,所以我想我需要更加高效的解决方案。
看来你想要一个发光效果,所以你可以使用的下一个想法:
- 做一个
OpacityPictureBox : PictureBox
支持不透明度(1-100或双0-1级)。 见这以获取更多信息。 - 添加的两个公共const int的值
MaxOpacity
和MinOpacity
到OpacityPictureBox
类,从外部容易和安全的范围检查。 该值可能是0,100或0,1,或别的东西,这取决于您的实现不透明度。 - 作出
AnimatedPictureBox : UserControl
,其保持1张PictureBox
命名pbNormal
和1个OpacityPictureBox
命名opbHover
,两个Dock = DockStyle.Fill
,和一个定时器命名timer
。 确保pbNormal
低于opbHover
。 - 有三个公共属性:
-
Normal
类型的Image
,其代表为pbNormal.Image
-
Hover
类型的Image
,其代表为opbHover.Image
-
AnimationInterval
类型的int
其中delgates成timer.Interval
- 在的构造
AnimatedPictureBox
,打完电话后InitializeComponents
,做opbHover.Opacity = 0;
。 你也可以做this.Cursor = Cursors.Hand;
如果你想将光标悬停在它的时候变成一只手。 - 有一个私有成员:
_animationDirection
类型的int
,这将是-1或1。 - 有开始在给定方向的动画的私有方法:
码:
private void Animate(int animationDirection)
{
this._animationDirection = animationDirection;
this.timer.Start();
}
- 重写
OnMouseEnter
和OnMouseLeave
:
码:
protected override void OnMouseEnter(EventArgs e)
{
this.Animate(1);
base.OnMouseEnter(e);
}
protected override void OnMouseLeave(EventArgs e)
{
this.Animate(-1);
base.OnMouseEnter(e);
}
码:
private void timer_Tick(object sender, EventArgs e)
{
var hoverOpacity = this.opbHover.Opacity + this._animationDirection;
if (hoverOpacity < OpacityPictureBox.MinOpacity ||
hoverOpacity > OpacityPictureBox.MaxOpacity)
{
this.timer.Stop();
return;
}
this.opbHover.Opacity = hoverOpacity;
}