2012-11-30 63 views
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); 
     } 
    } 
} 

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

我见过的非常光滑透明的动画做here在WPF,
我已经把它背后的一些标签,他们被视为直通旋转轮,我希望。
但我不知道WPF是否足以在WPF中构建这样的控件。

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

回答

0

这解决了从构造函数中删除这一行:

base.DoubleBuffered = true; 

现在能控制是完全透明的,即使改变其图像。