当前位置:网站首页>C# SmoothProgressBar自定义进度条控件
C# SmoothProgressBar自定义进度条控件
2022-04-23 06:26:00 【大可山人】
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
namespace SmoothProgressBar
{
/// <summary>
/// UserControl1 的摘要说明。
/// </summary>
public class SmoothProgressBar : System.Windows.Forms.UserControl
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public SmoothProgressBar()
{
// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent();
// TODO: 在 InitComponent 调用后添加任何初始化
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( components != null )
components.Dispose();
}
base.Dispose( disposing );
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
//
// SmoothProgressBar
//
this.Name = "SmoothProgressBar";
}
#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
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));
}
}
}
版权声明
本文为[大可山人]所创,转载请带上原文链接,感谢
https://blog.csdn.net/johnsuna/article/details/121020779
边栏推荐
- SAP PI / Po rfc2restful Publishing RFC interface as restful examples (proxy indirect)
- Mobile game performance optimization
- SAP PI/PO rfc2Soap 发布rfc接口为ws示例
- 移动布局(flex布局、视口标签)
- 定位、修饰样式
- Mysql 索引
- ‘npm‘不是内部或外部命令,也不是可运行的程序 或批处理文件
- 2022.3.14 Ali written examination
- Preliminary configuration of OpenGL super Dictionary (freeglut, glew, gltools, GLUT)
- [self motivation series] what really hinders you?
猜你喜欢
SAP TRANSLATE使用数据对象掩码示例
Configure NPM
Ogldev reading notes
自定义时间格式(YYYY-MM-DD HH:mm:ss 星期X)
js之DOM事件
Redis connection error err auth < password > called without any password configured for the default user
keytool: command not found
SAP PI/PO Soap2Proxy 消费外部ws示例
redis连接出错 ERR AUTH <password> called without any password configured for the default user.
Design optimization of MySQL database
随机推荐
Preliminary configuration of OpenGL super Dictionary (freeglut, glew, gltools, GLUT)
对js中argumens的简单理解
反转链表练习
BTREE, B + tree and hash index
Visualization Road (IX) detailed explanation of arrow class
11.表和库的管理
js之函数的两种声明方式
Simple random roll call lottery (written under JS)
王者荣耀-unity学习之旅
7. sub query
Common DOS commands
页面动态显示时间(升级版)
驼峰命名对像
页面实时显示当前时间
9. Common functions
The difference and application of VR, AR and MR, as well as some implementation principles of AR technology
js案例之求最大值,反转数组,冒泡排序
【TED系列】如何与内心深处的批评家相处?
移动布局(flex布局、视口标签)
5.SQL99标准:内连接和外连接