如何使用C#在计算器中创建类似的按钮动画

时间:2012-10-06 08:11:33

标签: c# winforms animation

当你将鼠标悬停在按钮上时,有人可以帮助创建类似于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个按钮,所以我认为我需要更有效的解决方案。

1 个答案:

答案 0 :(得分:1)

您似乎想要一个发光效果,因此您可以使用下一个想法:

  • 制作支持不透明度的OpacityPictureBox : PictureBox(级别为1-100或双0-1)。有关详细信息,请参阅this
  • MaxOpacityMinOpacity的两个公共const int值添加到OpacityPictureBox类,以便从外部进行简单安全的范围检查。值可能是0,100或0,1或其他值,具体取决于您对不透明度的实现。
  • 制作一个AnimatedPictureBox : UserControl,其中包含名为PictureBox的1 pbNormal和名为OpacityPictureBox的1 opbHoverDock = DockStyle.Fill和一个名为{的计时器{1}}。确保timer低于pbNormal
  • 有三个公共财产:
      {li> opbHover类型为Normal的{​​{1}} {li> Image类型为pbNormal.Image的{​​{1}} 类型为Hover
    • Image,其分为opbHover.Image
  • AnimationInterval的构造函数中,在调用int后,执行timer.Interval。如果您想将光标悬停在手上,也可以AnimatedPictureBox进行操作。
  • 拥有InitializeComponents类型的私人会员opbHover.Opacity = 0;,即-1或1。
  • 拥有一个以给定方向启动动画的私有方法:

代码:

this.Cursor = Cursors.Hand;
  • 覆盖_animationDirectionint

代码:

private void Animate(int animationDirection)
{
    this._animationDirection = animationDirection;
    this.timer.Start();
}
  • 收听OnMouseEnter事件,并注意:

代码:

OnMouseLeave