IE 9就像winforms中的按钮热跟踪一样

时间:2011-12-29 03:19:52

标签: c# winforms animation

我有一个类目前在正常和鼠标悬停状态之间切换2个图像,但我想添加一个在2之间切换的微妙动画。

是否有任何(简单)方法可以让按钮从一个图像动画到另一个图像,例如IE 9浏览器中的按钮?

编辑:

由于joe_coolish的回答,这是我用于OnPaint重载的最终解决方案

protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.DrawImage(_normalImage, 0, 0);

        ColorMatrix matrix = new ColorMatrix();
        matrix.Matrix33 = _opacity;

        ImageAttributes attributes = new ImageAttributes();
        attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

        e.Graphics.DrawImage(_hotImage, this.DisplayRectangle, 0, 0,
            this.DisplayRectangle.Width, this.DisplayRectangle.Height, GraphicsUnit.Pixel, attributes);

        if (_opacity < 1 && _over)
        {
            _opacity += 0.02f;
            _opacity = Math.Min(1, _opacity);
            this.Invalidate();
        }
        if (_opacity > 0 && !_over)
        {
            _opacity -= 0.02f;
            _opacity = Math.Max(0, _opacity);
            this.Invalidate();
        }
    }

我最终不得不阻止将不透明度设置为高于1或低于0,否则我最终会遇到一些奇怪的行为。

注意:确保控件是双缓冲或者闪烁不良也很重要。

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

1 个答案:

答案 0 :(得分:2)

图像有何不同?如果你想要一个“淡入/淡出”类型的东西,尝试这样的事情:

    private float _opacity = 0.0f;
    private bool _over = false;

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.DrawImage(imgOne);

        ColorMatrix matrix = new ColorMatrix();
        matrix.Matrix33 = _opacity; //opacity 0 = completely transparent, 1 = completely opaque

        ImageAttributes attributes = new ImageAttributes();
        attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

        e.Graphics.DrawImage(imgTwo, new Rectangle(0, 0, imgTwo.Width, imgTwo.Height), 0, 0, imgTwo.Width, imgTwo.Height, GraphicsUnit.Pixel, attributes);

        if(_opacity < 1 && _over)
        {
            _opacity += 0.05f;   //  Play with this!!
            Invalidate();
        }
        if(_opacity > 0 && !_over)
        {
            _opacity -= 0.05f;   //  Play with this!!
            Invalidate();    
        }
    }

然后只需在鼠标进出时设置_over bool!

这是一个非常粗略的代码集,而IDK甚至可以编译,但这是一个非常好的起点!