0

我正在为动画编写用户控件。
它使用内部 ImageList 来存储动画图像并在循环中一个接一个地绘制。
这是整个代码:

public partial class Animator : UserControl
{
    public event EventHandler OnLoopElapsed = delegate { };
    private ImageList imageList = new ImageList();
    private Timer timer;
    private bool looping = true;
    private int index;
    private Image newImage;
    private Image oldImage;

    public Animator()
    {
        InitializeComponent();

        base.DoubleBuffered = true;

        timer = new Timer();
        timer.Tick += timer_Tick;
        timer.Interval = 50;
    }

    public bool Animate
    {
        get { return timer.Enabled; }
        set
        {
            index = 0;
            timer.Enabled = value;
        }
    }

    public int CurrentIndex
    {
        get { return index; }
        set { index = value; }
    }

    public ImageList ImageList
    {
        set
        {
            imageList = value;
            Invalidate();
            index = 0;
        }

        get { return imageList; }
    }

    public bool Looping
    {
        get { return looping; }
        set { looping = value; }
    }

    public int Interval
    {
        get { return timer.Interval; }
        set { timer.Interval = value; }
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        if (imageList.Images.Count == 0)
            return;

        Invalidate(true);
        index++;

        if (index >= imageList.Images.Count)
        {
            if (looping)
                index = 0;
            else
                timer.Stop();

            OnLoopElapsed(this, EventArgs.Empty);
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        if (oldImage != null)
            e.Graphics.DrawImage(oldImage, ClientRectangle);
        else
            e.Graphics.Clear(BackColor);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics g = e.Graphics;

        if (imageList.Images.Count > 0)
        {
            newImage = imageList.Images[index];
            g.DrawImage(newImage, ClientRectangle);
            oldImage = newImage;
        }
        else
        {
            e.Graphics.Clear(BackColor);
        }
    }
}

动画看起来非常漂亮和流畅,
但问题是它周围的矩形被涂成黑色。
我在这里想念什么?

我在 WPF 中看到了非常平滑的透明动画,
在它后面放置了一些标签,它们可以通过旋转轮看到,正如我希望的那样。
但我对 WPF 的了解还不够,无法在 WPF 中构建这样的控件。

任何想法或 WPF 示例代码将不胜感激。

4

1 回答 1

0

这是通过从构造函数中删除这一行来解决的:

base.DoubleBuffered = true;

现在该控件是完全透明的,即使在更改其图像时也是如此。

于 2012-12-02T19:57:57.830 回答