高级进度条控件源码

 using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Text;
using System.Collections.Specialized;

namespace CNEE.IF.VCY
{
 /// <summary>
 /// ProcessBarValue 的摘要说明。
 /// </summary>
 public class ProcessBarValue : System.Windows.Forms.UserControl
 {
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;

  public ProcessBarValue()
  {
   // 该调用是 Windows.Forms 窗体设计器所必需的。
   InitializeComponent();

   // TODO: 在 InitializeComponent 调用后添加任何初始化

  }

  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if(components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }

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

  }
  #endregion
  //
  int min = 0; //Minimum value for progress range   
  int max = 100; //Maximum value for progress range   
  int val = 0; //Current progress   
  Color BarColor = Color.Blue; //Color of progress meter   
  string content = "Contents here";
  int blockWidth = 36;
  int intervalWidth = 4;

  public int Minimum
  {
   get { return min; }

   set
   {
    //Prevent a negative value.   
    if (value < 0)
    {
     min = 0;
    }

    //Make sure that the minimum value is never set higher than the maximum value.   

    if (value > max)
    {
     min = value;
     min = value;
    }

    //Ensure value is still in range   
    if (val < min)
    {
     val = min;
    }

    //Invalidate the control to get a repaint.   
    this.Invalidate();
   }
  }

  public int Maximum
  {
   get { return max; }

   set
   {
    //Make sure that the maximum value is never set lower than the minimum value.   
    if (value < min)
    {
     min = value;
    }

    max = value;

    //Make sure that value is still in range.   
    if (val > max)

    {
     val = max;
    }

    //Invalidate the control to get a repaint.   
    this.Invalidate();
   }
  }

  public int Value
  {
   get { return val; }

   set
   {
    int oldValue = val;

    //Make sure that the value does not stray outside the valid range.  
    if (value < min)
    {
     val = min;
    }
    else if (value > max)
    {
     val = max;
    }
    else
    {
     val = value;
    }

    //Invalidate only the changed area.   
    float percent;


    Rectangle newValueRect = this.ClientRectangle;
    Rectangle oldValueRect = this.ClientRectangle;

    //Use a new value to calculate the rectangle for progress.   
    percent = (float)(val - min) / (float)(max - min);
    newValueRect.Width = (int)((float)newValueRect.Width * percent);

    //Use an old value to calculate the rectangle for progress.   
    percent = (float)(oldValue - min) / (float)(max - min);
    oldValueRect.Width = (int)((float)oldValueRect.Width * percent);

    Rectangle updateRect = new Rectangle();

    //Find only the part of the screen that must be updated.   
    if (newValueRect.Width > oldValueRect.Width)
    {
     updateRect.X = oldValueRect.Size.Width;
     updateRect.Width = newValueRect.Width - oldValueRect.Width;
    }
    else
    {
     updateRect.X = newValueRect.Size.Width;
     updateRect.Width = oldValueRect.Width - newValueRect.Width;
    }

    updateRect.Height = this.Height;

    //Invalidate the intersection region only.   
    this.Invalidate(updateRect);
   }
  }

  public Color ProgressBarColor
  {
   get { return BarColor; }

   set
   {
    BarColor = value;

    //Invalidate the control to get a repaint.   
    this.Invalidate();
   }
  }

  public string ContentText
  {
   get { return content; }
   set
   {
    content = value;
    this.Refresh();
   }
  }

  public int BlockWidth
  {
   get { return blockWidth; }
   set
   {
    if (value >= 0)
    {
     blockWidth = value;
    }
    else

    {
     blockWidth = 0;
    }

    if (value <= max - min)
    {
     blockWidth = value;
    }
    else
    {
     blockWidth = max - min;
    }
    this.Refresh();
   }
  }

  public int IntervalWidth
  {
   get { return intervalWidth; }
   set
   {
    if (value >= 0)
    {
     intervalWidth = value;
    }
    else
    {
     intervalWidth = 0;
    }

    if (value <= max - min)
    {
     intervalWidth = value;

    }
    else
    {
     intervalWidth = max - min;
    }
    this.Refresh();
   }
  }

  //  public AdvancedProgressBar()
  //  {
  //   InitializeComponent();
  //  }

  protected override void OnResize(EventArgs e)
  {
   //Invalidate the control to get a repaint.   
   this.Invalidate();
  }

  protected override void OnPaint(PaintEventArgs e)
  {
   Graphics g = e.Graphics;
   SolidBrush brush = new SolidBrush(BarColor);
   float percent = (float)(val - min) / (float)(max - min);
   Rectangle rect = this.ClientRectangle;
   Rectangle rectFilled = new Rectangle();
   Rectangle rectNotFilled = new Rectangle();
   rectFilled.Height = rect.Height;
   rectNotFilled.Height = rect.Height;
   rectFilled.Y = rect.Y;
   rectNotFilled.Y = rect.Y;
   rectFilled.Width = blockWidth;

   rectNotFilled.Width = intervalWidth;
   int x = rect.X;

   //Calculate area for drawing the progress.   
   rect.Width = (int)((float)rect.Width * percent);

   //Draw the progress meter.   
   //g.FillRectangle(brush, rect);

   while (true)
   {
    rectFilled.X = x;


    if (x + rectFilled.Width < rect.Width)
    {
     g.FillRectangle(brush, rectFilled);
    }
    else
    {
     rectFilled.Width = rect.Width - x;
     g.FillRectangle(brush, rectFilled);
     break;
    }

    x += rectFilled.Width;
    rectNotFilled.X = x;

    if (x + rectNotFilled.Width < rect.Width)
    {
     g.FillRectangle((Brush)(new SolidBrush(Color.Empty)), rectNotFilled);
    }
    else

    {
     rectNotFilled.Width = rect.Width - x;
     g.FillRectangle((Brush)(new SolidBrush(Color.Empty)), rectNotFilled);
     break;
    }

    x += rectNotFilled.Width;
   }

   //Draw a three-dimensional border around the control.   
   Draw3DBorder(g);

   //Draw [ xx mins left ]
   DrawText(content);

   //Clean up.  
   brush.Dispose();
   g.Dispose();
  }

  private void Draw3DBorder(Graphics g)
  {
   int PenWidth = (int)Pens.White.Width;

   g.DrawLine(Pens.DarkGray, new Point(this.ClientRectangle.Left, this.ClientRectangle.Top),
    new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Top));
   g.DrawLine(Pens.DarkGray, new Point(this.ClientRectangle.Left, this.ClientRectangle.Top), new Point(this.ClientRectangle.Left,
    this.ClientRectangle.Height - PenWidth));
   g.DrawLine(Pens.White, new Point(this.ClientRectangle.Left, this.ClientRectangle.Height - PenWidth),
    new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Height - PenWidth));
   g.DrawLine(Pens.White, new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Top),
    new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Height - PenWidth));
  }

  /// <summary>
  /// 标签
  /// </summary>
  private Label ContentLabel;
  private void DrawText(string content)
  {
   ContentLabel = new System.Windows.Forms.Label();
   int leftWidth = (int)((float)this.ClientRectangle.Width * (((float)max - (float)val) / ((float)max - (float)min)));
   
   
    ContentLabel.Text = content;

   int middleY = this.ClientRectangle.Height / 2 - ContentLabel.Height / 2;

   if (ContentLabel.Width < leftWidth)
   {
    ContentLabel.ForeColor = Color.Black;
    int middleX = this.ClientRectangle.Width / 2 - ContentLabel.Width / 2 + (this.ClientRectangle.Width - leftWidth) / 2;
    ContentLabel.Location = new Point(middleX, middleY);
   }
   else
   {
    ContentLabel.ForeColor = Color.White;
    int middleX = (this.ClientRectangle.Width - leftWidth) / 2 - ContentLabel.Width / 2;
    ContentLabel.Location = new Point(middleX, middleY);
   }
  }
 }
}

你可能感兴趣的:(String,null,Class,float,border,Components)