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 に答える