不闪烁的进度条控件

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D ;
using System.Data;
using System.Windows.Forms;

namespace MyControls
{
 /// <summary>
 /// GProgressBar 的摘要说明。
 /// </summary>

 public class GProgressBar : System.Windows.Forms.UserControl
 {

  #region 必需的设计器变量
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;
  #endregion

  #region 组件设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器
  /// 修改此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   //
   // GProgressBar
   //
   this.Name = "GProgressBar";
   this.Size = new System.Drawing.Size(150, 24);
  }
  #endregion

  #region 私有变量
  private int mMax = 100;
  private int mMin = 0;
  private int mValue = 0 ;
  private int mStep = 1;
  private bool mRate = false;
  private BorderStyle mBorderStyle = BorderStyle.Fixed3D ;
  #endregion

  #region 构造/析构
  public GProgressBar()
  {
   // 该调用是 Windows.Forms 窗体设计器所必需的。
   InitializeComponent();
   base.Height = 23 ;

   ///使用双缓冲,支持透明绘制
   ///DoubleBuffer:如果为 true,则绘制在缓冲区中进行,完成后将结果输出到屏幕上。
   ///双重缓冲区可防止由控件重绘引起的闪烁。
   ///要完全启用双重缓冲,还必须将 UserPaint 和 AllPaintingInWmPaint 样式位设置为 true。
   SetStyle(ControlStyles.DoubleBuffer |
      ControlStyles.UserPaint |
      ControlStyles.AllPaintingInWmPaint |
      ControlStyles.SupportsTransparentBackColor,
      true);
   UpdateStyles();
  }

  ~GProgressBar(){}

  #region 重写基类的Dispose实现
  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if(components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }
  #endregion

  #endregion

  #region 属性

   #region 最大值
   /// <summary>
   /// 最大值
   /// </summary>
   [Browsable(true), Description("最大值"), Category("新属性")]
   public int Max
   {
    get
    {
     return mMax ;
    }
    set
    {
     mMax = value > 0?value:1;
    }
   }
   #endregion

   #region 最小值
   /// <summary>
   /// 最小值
   /// </summary>
   [Browsable(true), Description("最小值"), Category("新属性")]
   public int Min
   {
    get
    {
     return mMin ;
    }
    set
    {
     mMin = value ;
    }
   }
   #endregion

   #region 当前值
   /// <summary>
   /// 当前值
   /// </summary>
   [Browsable(true), Description("当前值"), Category("新属性")]
   public int Value
   {
    get
    {
     return mValue ;
    }
    set
    {
     if (value <= this.Max)
      mValue = value ;
     else
      mValue = this.Max ;
     this.Refresh() ;
    }
   }
   #endregion

   #region 大小
   /// <summary>
   /// 大小
   /// </summary>
   [Browsable(true), Description("大小"), Category("新属性")]
   public new Size Size
   {
    get
    {
     return base.Size ;
    }
    set
    {
     base.Size = value ;
    }
   }
   #endregion

   #region 步长
   /// <summary>
   /// 步长
   /// </summary>
   [Browsable(true), Description("步长"), Category("新属性")]
   public int Step
   {
    get
    {
     return mStep ;
    }
    set
    {
     mStep = value ;
    }
   }
   #endregion

   #region 背景色
   /// <summary>
   /// 背景色
   /// </summary>
   [Browsable(true), Description("背景色"), Category("新属性")]
   public override Color BackColor
   {
    get
    {
     return base.BackColor ;
    }
    set
    {
     base.BackColor = value ;
    }
   }
   #endregion

   #region 前景色
   /// <summary>
   /// 前景色
   /// </summary>
   [Browsable(true), Description("前景色"), Category("新属性")]
   public override Color ForeColor
   {
    get
    {
     return base.ForeColor ;
    }
    set
    {
     base.ForeColor = value ;
    }
   }
   #endregion

   #region 是否显示比例数字
   /// <summary>
   /// 是否显示比例数字
   /// </summary>
   [Browsable(true), Description("是否显示比例数字"), Category("新属性")]
   public bool Rate
   {
    get
    {
     return mRate ;
    }
    set
    {
     mRate = value ;
    }
   }
   #endregion

   #region 外观
   /// <summary>
   /// 外观
   /// </summary>
   [DefaultValue(0), Description("外观"), Category("新属性")]
   public BorderStyle BorderStyle
   {
    get
    {
     return this.mBorderStyle;
    }
    set
    {
     if (this.mBorderStyle != value)
     {
      this.mBorderStyle = value;
      this.Refresh() ;
     }
    }
   }
   #endregion

  #endregion

  #region 公有方法

   #region 执行增步操作
   /// <summary>
   /// 执行增步操作
   /// </summary>
   public void PerformStep()
   {
    Value++ ;
   }
   #endregion

  #endregion

  #region 私有方法

   #region 绘制时钟
   /// <summary>
   /// 绘制进度条(重载1)
   /// </summary>
   /// <returns>位图对象</returns>
   public Bitmap DrawProgress()
    {
     return this.DrawProgress(this.ClientRectangle);
    }  
   /// <summary>
   /// 绘制进度条(重载2)
   /// </summary>
   /// <param name="destRect">区域</param>
   /// <returns>位图对象</returns>
    public Bitmap DrawProgress(Rectangle destRect)
    {
     Bitmap bitmap = new Bitmap(destRect.Width, destRect.Height);
     Graphics g = Graphics.FromImage(bitmap);

    //设置绘图面板的绘制质量等
     g.CompositingQuality = CompositingQuality.HighQuality;
     g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
     g.SmoothingMode = SmoothingMode.HighQuality; 
     GraphicsState gs = g.Save();
     g.TranslateTransform(destRect.X, destRect.Y);

    int iWidth = (Value * destRect.Width) / Max ;
    Rectangle DrawRect = new Rectangle(destRect.X,destRect.Y,iWidth,destRect.Height) ;
    SolidBrush front = new SolidBrush(this.ForeColor) ;
    g.FillRectangle(front,DrawRect);
    if (Rate)
    {
     int iRate = Value * 100 / Max ;
     string strText = iRate.ToString() + "%" ;
     int iTextWidth = (int)g.MeasureString(strText,this.Font).Width ;
     int iTextHeight = (int)g.MeasureString(strText,this.Font).Height;
     int x = destRect.Left + (destRect.Width - iTextWidth) / 2 ;
     int y = destRect.Top + (destRect.Height - iTextHeight) / 2;
     Point posS = new Point(x,destRect.Top);
     Point posE = new Point(x + iTextWidth,destRect.Bottom);
     LinearGradientBrush textbrush = new LinearGradientBrush(posS,posE,this.BackColor,this.ForeColor) ;
     g.DrawString(strText,this.Font,textbrush,x,y);
    }
     g.Restore(gs);
     return bitmap;
    }

   /// <summary>
   /// 绘制进度条(重载3)
   /// </summary>
   /// <param name="g">Graphics对象</param>
   /// <param name="rect">区域</param>
   private void DrawProgress(Graphics g,Rectangle destRect)
   {
    int iWidth = (Value * destRect.Width) / Max ;
    Rectangle DrawRect = new Rectangle(destRect.X,destRect.Y,iWidth,destRect.Height) ;
    SolidBrush front = new SolidBrush(this.ForeColor) ;
    g.FillRectangle(front,DrawRect);
    if (Rate)
    {
     int iRate = Value * 100 / Max ;
     string strText = iRate.ToString() + "%" ;
     int iTextWidth = (int)g.MeasureString(strText,this.Font).Width ;
     int iTextHeight = (int)g.MeasureString(strText,this.Font).Height;
     int x = destRect.Left + (destRect.Width - iTextWidth) / 2 ;
     int y = destRect.Top + (destRect.Height - iTextHeight) / 2;
     Point posS = new Point(x,destRect.Top);
     Point posE = new Point(x + iTextWidth,destRect.Bottom);
     LinearGradientBrush textbrush = new LinearGradientBrush(posS,posE,this.BackColor,this.ForeColor) ;
     g.DrawString(strText,this.Font,textbrush,x,y);
    }
   }
   #endregion

  #endregion

  #region 重写的方法

   #region OnPaintBackground
   /// <summary>
   /// OnPaintBackground
   /// </summary>
   /// <param name="e">事件包</param>
   protected override void OnPaintBackground(PaintEventArgs e)
   {
    SolidBrush back = new SolidBrush(this.BackColor);
    e.Graphics.FillRectangle(back,e.ClipRectangle);
    base.OnPaintBackground(e);
   }
   #endregion

   #region OnPaint
   /// <summary>
   /// OnPaint
   /// </summary>
   /// <param name="e">事件包</param>
   protected override void OnPaint(PaintEventArgs e)
   {
    /*
     Graphics g = e.Graphics;
     g.CompositingQuality = CompositingQuality.HighQuality;
     g.DrawImageUnscaled(DrawProgress(), 0, 0);
    base.OnPaint(e);
    */
    

    
    //if (!this.DesignMode) //设计模式
    Graphics g = e.Graphics;
     g.CompositingQuality = CompositingQuality.HighQuality;
    DrawProgress(g,this.ClientRectangle);
    //DrawProgress(e.Graphics,e.ClipRectangle);
    switch(BorderStyle)
    {
     case BorderStyle.None:
      break;
     case BorderStyle.FixedSingle:
      System.Windows.Forms.ControlPaint.DrawBorder3D(e.Graphics,this.ClientRectangle,Border3DStyle.Flat);
      //System.Windows.Forms.ControlPaint.DrawBorder3D(e.Graphics,e.ClipRectangle,Border3DStyle.Flat);
      break;
     case BorderStyle.Fixed3D:
      System.Windows.Forms.ControlPaint.DrawBorder3D(e.Graphics,this.ClientRectangle,Border3DStyle.Sunken);
      //System.Windows.Forms.ControlPaint.DrawBorder3D(e.Graphics,e.ClipRectangle,Border3DStyle.Sunken);
      break;
    }
    base.OnPaint(e);
    
   }
   #endregion

   #region OnLayout
   /// <summary>
   /// OnLayout
   /// </summary>
   /// <param name="e">事件包</param>
   protected override void OnLayout(LayoutEventArgs e)
   {
    base.Refresh();
    base.OnLayout(e);
   }
   #endregion

  #endregion

 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值