重写C# winform 进度条的样式(要代码示例)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重写C# winform 进度条的样式(要代码示例)相关的知识,希望对你有一定的参考价值。

重写C# winform 进度条的样式,需要上面的进度条样式,要代码示例谢谢

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 

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; 

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

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

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

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

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(); 
  
 

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)); 

参考技术A 无需重写
自己新建个组建,继承自Control或PictureBox
自己绘制进度
向外提供最小值最大值当前值属性或方法即可
当值改变时,重绘
override OnPaint
参考技术B http://www.yesky.com/427/1878927.shtml
这个连接上的内容看一下就OK了
我看了UserControl和Control类的区别还是有区别的,Control类继承了实现了更多的接口,很复杂。UserControl就只单纯的提供简单的灵活的控件自定义!
Control类不能被继承(可以继承,可是里面要怎么写呢?不知道了),应为封装的你看不到他里面的方法实现!所以要继承UserControl本回答被提问者采纳

(68)C#里怎么样提供一个有窗口显示进度条的拷贝目录的功能

(68)C#里怎么样提供一个有窗口显示进度条的拷贝目录的功能

在C#里开发,常常会遇到拷贝大目录的文件,比如很多LOG日志,运行时间久了,需要把它们备份起来,那么就需要拷贝这些文件,这时候就会比较久,如果不显示一个提示窗口,就让人不知道这个程序在干什么样的事情,误认为程序已经出错,或者没有干事情。

在C#里提供这一个窗口,是非常简单的,只需要使用下几行代码就解决了,这个例子演示如下:

using System;
usin

以上是关于重写C# winform 进度条的样式(要代码示例)的主要内容,如果未能解决你的问题,请参考以下文章

C# WinForm自定义进度条

C# winform加载子窗体很慢 如何用进度条显示

如何制作WinForm中自定义进度条

C# Winform 多线程异步委托进度条

Winform进度条的问题,请高手指点

C# Winform 想做一个CSV传入数据库的进度条,怎么做?