1

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

4

1 回答 1

1

看来你想要一个发光效果,所以你可以使用下一个想法:

  • 制作一个OpacityPictureBox : PictureBox支持不透明度的(在 1-100 或双 0-1 级别)。有关更多信息,请参阅
  • MaxOpacity将和的两个 public const int 值添加MinOpacityOpacityPictureBox类中,以便从外部轻松安全地检查范围。这些值可能是 0、100 或 0、1 或其他值,具体取决于您对不透明度的实现。
  • 制作一个AnimatedPictureBox : UserControl包含 1 个PictureBoxnamedpbNormal和 1 个OpacityPictureBoxnamedopbHover的东西Dock = DockStyle.Fill,以及一个名为 的计时器timer。确保pbNormal在下面opbHover
  • 拥有三个公共属性:
    • NormalImage委托给的类型pbNormal.Image
    • HoverImage委托给的类型opbHover.Image
    • AnimationInterval类型int的代入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();
}
  • 覆盖OnMouseEnterOnMouseLeave

代码:

 protected override void OnMouseEnter(EventArgs e)
 {
     this.Animate(1);
     base.OnMouseEnter(e);
 }

 protected override void OnMouseLeave(EventArgs e)
 {
     this.Animate(-1);
     base.OnMouseEnter(e);
 }
  • timer.Tick事件和这个:

代码:

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;
}
于 2012-10-06T09:54:00.260 回答