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(232, 249, 255);
private static readonly Color _enterBorderColor = Color.FromArgb(212, 237, 255);
private static readonly Color _selectBodyColor = Color.FromArgb(221, 244, 255);
private static readonly Color _selectBorderColor = Color.FromArgb(179, 215, 241);
private static readonly Color _pictureBoxBorderColor = Color.FromArgb(49, 106, 196);
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; }
}
}
{
#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(232, 249, 255);
private static readonly Color _enterBorderColor = Color.FromArgb(212, 237, 255);
private static readonly Color _selectBodyColor = Color.FromArgb(221, 244, 255);
private static readonly Color _selectBorderColor = Color.FromArgb(179, 215, 241);
private static readonly Color _pictureBoxBorderColor = Color.FromArgb(49, 106, 196);
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; }
}
}

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

被折叠的 条评论
为什么被折叠?



