自定义控件显示GIF图像

本文介绍了一个自定义的Gif动画显示控件GifShow,该控件继承自Control类,通过设置样式来实现平滑动画播放效果,并提供了一系列方法来控制动画的播放与停止。

 

public class GifShow : Control
    {
        
#region 变量

        
private Image _image;
        
private Rectangle _imageRectangle;
        
private EventHandler _eventAnimator;
        
private bool _canAnimate;

        
#endregion

        
#region 构造函数

        
public GifShow()
            : 
base()
        {
            SetStyle(
                ControlStyles.UserPaint 
|
                ControlStyles.AllPaintingInWmPaint 
|
                ControlStyles.OptimizedDoubleBuffer 
|
                ControlStyles.CacheText 
|
                ControlStyles.ResizeRedraw, 
true);
        }

        
#endregion

        
#region 属性

        
public Image Image
        {
            
get { return _image; }
            
set
            {
                StopAnimate();
                _image 
= value;
                _imageRectangle 
= Rectangle.Empty;
                
if (value != null)
                    _canAnimate 
= ImageAnimator.CanAnimate(_image);
                
else
                    _canAnimate 
= false;
                Invalidate(ImageRectangle);
                
if(!DesignMode)
                    StartAnimate();
            }
        }

        
private Rectangle ImageRectangle
        {
            
get
            {
                
if (_imageRectangle == Rectangle.Empty &&
                    _image 
!= null)
                {
                    _imageRectangle.X 
= (Width - _image.Width) / 2;
                    _imageRectangle.Y 
= (Height - _image.Height) / 2;
                    _imageRectangle.Width 
= _image.Width;
                    _imageRectangle.Height 
= _image.Height;
                }
                
return _imageRectangle;
            }
        }

        
private bool CanAnimate
        {
            
get { return _canAnimate; }
        }

        
private EventHandler EventAnimator
        {
            
get
            {
                
if (_eventAnimator == null)
                    _eventAnimator 
= delegate(object sender, EventArgs e)
                    {
                        Invalidate(ImageRectangle);
                    };
                
return _eventAnimator;
            }
        }

        
#endregion

        
#region Override

        
protected override void OnSizeChanged(EventArgs e)
        {
            _imageRectangle 
= Rectangle.Empty;
            
base.OnSizeChanged(e);
        }

        
protected override void OnPaint(PaintEventArgs e)
        {
            
base.OnPaint(e);

            
if (_image != null)
            {
                UpdateImage();
                e.Graphics.DrawImage(
                    _image,
                    ImageRectangle,
                    
0,
                    
0,
                    _image.Width,
                    _image.Height,
                    GraphicsUnit.Pixel);
            }

            ControlPaint.DrawBorder(
                    e.Graphics,
                    ClientRectangle,
                    DefaultColors.PictureBoxBorderColor,
                    ButtonBorderStyle.Solid);
        }

        
protected override void Dispose(bool disposing)
        {
            
base.Dispose(disposing);
            _eventAnimator 
= null;
            _canAnimate 
= false;
            
if (_image != null)
            {
                _image.Dispose();
                _image 
= null;
            }

        }

        
protected override void OnHandleDestroyed(EventArgs e)
        {
            
base.OnHandleDestroyed(e);
            StopAnimate();
        }

        
#endregion

        
#region Private Method

        
private void StartAnimate()
        {
            
if (CanAnimate)
            {
                ImageAnimator.Animate(_image, EventAnimator);
            }
        }

        
private void StopAnimate()
        {
            
if (CanAnimate)
            {
                ImageAnimator.StopAnimate(_image, EventAnimator);
            }
        }

        
private void UpdateImage()
        {
            
if (CanAnimate)
            {
                ImageAnimator.UpdateFrames(_image);
            }
        }

        
#endregion
    }

 

internal static class DefaultColors
    {
        
private static readonly Color _enterBodyColor = Color.FromArgb(232249255);
        
private static readonly Color _enterBorderColor = Color.FromArgb(212237255);
        
private static readonly Color _selectBodyColor = Color.FromArgb(221244255);
        
private static readonly Color _selectBorderColor = Color.FromArgb(179215241);
        
private static readonly Color _pictureBoxBorderColor = Color.FromArgb(49106196);

        
public static Color EnterBodyColor
        {
            
get { return _enterBodyColor; }
        }

        
public static Color EnterBorderColor
        {
            
get { return _enterBorderColor; }
        }

        
public static Color SelectBodyColor
        {
            
get { return _selectBodyColor; }
        }

        
public static Color SelectBorderColor
        {
            
get { return _selectBorderColor; }
        }

        
public static Color PictureBoxBorderColor
        {
            
get { return _pictureBoxBorderColor; }
        }
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值