动态图片显示控件----------WinForm控件开发系列

Posted tlmbem

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态图片显示控件----------WinForm控件开发系列相关的知识,希望对你有一定的参考价值。

技术图片

PictureBox控件无法显示gif格式的图片,该控件利用.NET自带ImageAnimator类来处理图片的帧。

  /// <summary>
  /// 动态图片显示控件
  /// </summary>
  [ToolboxItem(true)]
  [DefaultProperty("Image")]
  [Description("动态图片显示控件")]
  public partial class AnimationImageExt : Control
  
    /// <summary>
    /// 图像的框架维度的属性
    /// </summary>
    private FrameDimension frameDimension;

    private Image image = null;
    /// <summary>   
    /// 要显示的图片   
    /// </summary>
    [Browsable(true)]
    [DefaultValue(null)]
    [Description("要显示的图片")]
    public Image Image
    
      get  return this.image; 
      set
      
        if (this.image == null && value == null)
          return;
        if (value == null)//清除图片
        
          if (this.isAnimation)
          
            this.StopAnimation();
          
          this.image = value;
          this.Invalidate();
        
        else//加载图片
        
          if (this.isAnimation)
          
            this.StopAnimation();
          
          this.image = value;
          lock (this.image)
          
            this.isAnimation = ImageAnimator.CanAnimate(this.image);
            if (this.isAnimation)//gif图片
            
              Guid[] guid = this.image.FrameDimensionsList;
              this.frameDimension = new FrameDimension(guid[0]);
              this.frameCount = this.image.GetFrameCount(this.frameDimension);
              this.currentFrame = 0;
              this.image.SelectActiveFrame(this.frameDimension, this.currentFrame);
              this.Invalidate();
              this.StartAnimation();
            
            else//普通图片
            
              this.frameCount = 1;
              this.currentFrame = 0;
              this.Invalidate();
            
          
        
      
    

    private bool isAnimation;
    /// <summary>   
    /// 是否为动态图片   
    /// </summary>  
    [Browsable(false)]
    [DefaultValue(false)]
    [Description("是否为动态图片")]
    public bool IsAnimation
    
      get  return this.isAnimation; 
    

    private int frameCount = 1;
    /// <summary>   
    /// 图片总帧数。   
    /// </summary>  
    [Browsable(false)]
    [DefaultValue(1)]
    [Description("图片总帧数")]
    public int FrameCount
    
      get  return this.frameCount; 
    

    private int currentFrame = 0;
    /// <summary>   
    /// 当前播放的帧索引   
    /// </summary>   
    [Browsable(false)]
    [DefaultValue(0)]
    [Description("当前播放的帧数")]
    public int CurrentFrame
    
      get  return this.currentFrame; 
    

    protected override Size DefaultSize
    
      get
      
        return new Size(100, 100);
      
    

    public AnimationImageExt()
    
      SetStyle(ControlStyles.UserPaint, true);
      SetStyle(ControlStyles.AllPaintingInWmPaint, true);
      SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
      SetStyle(ControlStyles.ResizeRedraw, true);
      SetStyle(ControlStyles.SupportsTransparentBackColor, true);

      InitializeComponent();
      this.BackColor = Color.Transparent;
    

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

      if (this.image != null)
      
        Graphics g = e.Graphics;
        g.DrawImage(this.image, new Point(0, 0));
      
    

    /// <summary>   
    /// 开始循环播放动态图片   
    /// </summary>   
    private void StartAnimation()
    
      lock (this.image)
      
        ImageAnimator.Animate(this.image, new EventHandler(this.FrameChanged));
      
    

    /// <summary>   
    /// 停止循环播放动态图片  
    /// </summary>   
    private void StopAnimation()
    
      lock (this.image)
      
        ImageAnimator.StopAnimate(this.image, new EventHandler(this.FrameChanged));
        this.resetProperty();
      
    

    /// <summary>
    /// 重置图片信息
    /// </summary>
    private void resetProperty()
    
      this.frameDimension = null;
      this.isAnimation = false;
      this.frameCount = 0;
      this.currentFrame = -1;
    

    /// <summary>
    /// 当前帧更改事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void FrameChanged(object sender, EventArgs e)
    
      this.currentFrame = this.currentFrame + 1 >= this.frameCount ? 0 : this.currentFrame + 1;
      lock (this.image)
      
        this.image.SelectActiveFrame(this.frameDimension, this.currentFrame);
        this.Invalidate();
      
    


  

 源码下载:动态图片显示控件.zip

以上是关于动态图片显示控件----------WinForm控件开发系列的主要内容,如果未能解决你的问题,请参考以下文章

winform窗体 Treeview控件子节点动态添加图片

在winform上添加用户控件过多时出现闪烁

winform如何用Timer实现将时间动态显示在窗体上?

wpf显示视频,image控件闪屏,使用winform控件实现

c# winform groupbox上动态生成的控件,如何让控件随着分辨率变化而自动调整位置和大小

winform怎么动态生成多个panel控件,并且生成两个控件换一行呢?