C#自定义控件 ————进度条
先看看样式




一个扇形的进度条
对外公开的方法和属性
事件
value_change;//值改变时触发的事件
progress_finshed;//进度条跑完时触发的事件
属性
Max_value//获取最大值
Min_value//获取最小值
Current_value//设置或获取当前值设置
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication19
{
public partial class CustomControl1 : Control
{
Bitmap background;
//进度条的最大值,最小值,和当前值
;
;
private int current_value;
;//用户保护max和min变量只赋值一次的值
;//
//控件的最小吃寸
private int min_size;
//三个颜色,最外层,中间层和最内填充层
, , );
, , );
, , );
//字体颜色
private Color str_color = Color.Black;
//最外层和中间层的宽度
private float edge_line_width = 5f;
private float edge_2_line_width = 5f;
private DockStyle dock=DockStyle.None;
//事件
public delegate void vaule_change_invoke(EventArgs args);
public event vaule_change_invoke value_change;//值改变时触发的事件
public event vaule_change_invoke progress_finshed;//进度条跑完时触发的事件
//这里我暂时不对外开放接口,控件样式固定
/*
public Color Edge_line_color
{
get { return edge_line_color; }
set { edge_line_color = value; }
}
public Color Edge_2_line_color
{
get { return edge_2_line_color; }
set { edge_2_line_color = value; }
}
public Color Inside_fill_color
{
get { return inside_fill_color; }
set { inside_fill_color = value; }
}
public Color Str_color
{
get { return str_color; }
set { str_color = value; }
}
public float Edge_line_width
{
get { return edge_line_width; }
set
{
if (value > 0)
edge_line_width = value;
}
}
public float Edge_2_line_width
{
get { return edge_2_line_width; }
set
{
if (value > 0)
edge_2_line_width = value;
}
}
*/
[Browsable(false)]
public new DockStyle Dock
{
get { return dock; }
set { dock = value; }
}
/// <summary>
/// 获取最小值
/// </summary>
[Browsable(false)]
public int Min_value
{
get { return min_value; }
private set
{
&&value<max_value && min_value_protect_value == )
{
min_value = value;
current_value = value;
min_value_protect_value = ;
}
}
}
/// <summary>
/// 获取最大值
/// </summary>
[Browsable(false)]
public int Max_value
{
get { return max_value; }
private set
{
&& value > Min_value && max_value_protect_value == )
{
max_value = value;
max_value_protect_value=;
}
}
}
/// <summary>
/// 设置或获取当前值,范围0-100
/// </summary>
public int Current_value
{
get { return current_value; }
set
{
if (value >= min_value && value <= max_value)
{
current_value = value;
//触发派生重写方法
this.onvaluechange(new EventArgs());
//重绘控件
this.Invalidate();
if (progress_finshed != null)
{
//进度条跑完时触发
if (max_value == current_value)
this.progress_finshed(new EventArgs());
}
if (value_change != null)
{
//触发事件
this.value_change(new EventArgs());
}
}
}
}
public CustomControl1()
{
InitializeComponent();
setinfo();
//这里触发一次OnInvalidated,保证在onpaint前建立背景位图
this.Invalidate();
min_size = ( + edge_line_width * + );
}
/// <summary>
/// 绘图优化
/// </summary>
private void setinfo()
{
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
}
/// <summary>
/// 值修改触发的方法
/// </summary>
/// <param name="eventArgs"></param>
protected virtual void onvaluechange(EventArgs eventArgs)
{
}
protected override void OnResize(EventArgs e)
{
//保证控件最小尺寸 //防止拖拽时崩毁
int temp = Math.Min(Width, Height);
temp = temp > min_size ? temp : min_size;
Width = Height = temp;
build_bitmap_buffer();
this.Invalidate();
base.OnResize(e);
}
/// <summary>
/// 控件及子控件重绘
/// </summary>
/// <param name="pe"></param>
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
/// <summary>
/// 控件重绘
/// </summary>
/// <param name="e"></param>
protected override void OnInvalidated(InvalidateEventArgs e)
{
if (background != null)
update_the_progress_bar();
else
{
build_bitmap_buffer();
}
base.OnInvalidated(e);
}
/// <summary>
/// 创建背景缓冲位图
/// </summary>
private void build_bitmap_buffer()
{
if (background != null)
{
background.Dispose();
}
background = new Bitmap(Width, Width);
Graphics g = Graphics.FromImage(background);
g.Clear(Color.Transparent);
g.Dispose();
}
/// <summary>
/// 根据当前值更新进度条
/// </summary>
private void update_the_progress_bar()
{
Graphics g = Graphics.FromImage(background);
Draw_with_HighQuality(g);
g.Clear(Color.Transparent);
Pen p = new Pen(edge_line_color, edge_line_width);
#region 绘制最外部圆
);
int w_h = Width - (int)edge_line_width;
Rectangle rect = new Rectangle(x_y, x_y, w_h, w_h);
g.DrawEllipse(p, rect);
#endregion
#region 绘制第二层圆
p.Width = edge_2_line_width;
p.Color = edge_2_line_color;
x_y += ( + edge_2_line_width / );
w_h = Width - ( + edge_2_line_width);
rect = new Rectangle(x_y, x_y, w_h, w_h);
g.DrawEllipse(p, rect);
#endregion
p.Dispose();
#region 绘制扇形
Brush sb = new SolidBrush(inside_fill_color);
x_y = (int)(edge_line_width + edge_2_line_width);
w_h = Width - x_y * ;
rect = new Rectangle(x_y, x_y, w_h, w_h);
float rad = ((float)current_value - min_value) / ((float)max_value - min_value);
* rad);
g.FillPie(sb, rect, -, frad);
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
g.DrawString((rad * ).ToString() + , FontStyle.Bold), new SolidBrush(str_color), this.ClientRectangle, sf);
#endregion
g.Dispose();
this.BackgroundImage = background;
}
/// <summary>
/// 高质量绘图
/// </summary>
/// <param name="g">绘图工具graphics</param>
private void Draw_with_HighQuality(Graphics g)
{
g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.CompositingQuality = CompositingQuality.HighQuality;
}
}
}
源码地址: http://pan.baidu.com/s/1i3N2vlz
压缩文件为测试控件的demo;
cs是控件的源码文件;直接添加到项目中和其他控件一样拖进去就可以了
C#自定义控件 ————进度条的更多相关文章
- (四十一)c#Winform自定义控件-进度条
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (四十二)c#Winform自定义控件-进度条扩展
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- (七)c#Winform自定义控件-进度条
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- 自定义控件 进度条 ProgressBar-2
使用 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bqt ...
- Android自定义控件:进度条的四种实现方式(Progress Wheel的解析)
最近一直在学习自定义控件,搜了许多大牛们Blog里分享的小教程,也上GitHub找了一些类似的控件进行学习.发现读起来都不太好懂,就想写这么一篇东西作为学习笔记吧. 一.控件介绍: 进度条在App中非 ...
- Android自定义控件系列之应用篇——圆形进度条
一.概述 在上一篇博文中,我们给大家介绍了Android自定义控件系列的基础篇.链接:http://www.cnblogs.com/jerehedu/p/4360066.html 这一篇博文中,我们将 ...
- Qt自定义控件系列(一) --- 圆形进度条
本系列主要使用Qt painter来实现一些基础控件.主要是对平时自行编写的一些自定义控件的总结. 为了简洁.低耦合,我们尽量不使用图片,qrc,ui等文件,而只使用c++的.h和.cpp文件. 由于 ...
- c# 自定义控件之小小进度条
先看效果图: 非常简洁的一个进度条. 完整项目源码下载:http://files.cnblogs.com/files/tuzhiyuan/%E8%BF%9B%E5%BA%A6%E6%9D%A1%E6% ...
- (三十八)c#Winform自定义控件-圆形进度条-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
随机推荐
- Cordova 教程 学习步骤-从零基础开始
Cordova的技术交流新群
- OpenCV编程->RGB直方图统计
我们在处理彩色图像时.特别是在做局部图像的阈值切割时,须要一个直观的RGB统计图. 接下来開始实现. 代码: void CalcHistRGB() { IplImage* img_sou ...
- 使用apt-get 安装后的mysql 登录问题
当使用apt-get安装mysql后,ubuntu会自动生成一个用户名和密码.所以在第一次登陆时会报如下错误 ERROR 1045 (28000): Access denied for user 'd ...
- 了解CentOS服务器的基本信息
简单描述了如何从CPU.内存.硬盘性能.负载方面去了解自己工作的服务器性能.这个很重要,必须了解机器的方方面面才能提高在自己运维工作效率. 一.查看linux服务器cpu详情 查看物理cpu个数: [ ...
- linux基础part5
linux 基础 一.网络基础 1.ifup 网卡名称:ifdown 网卡名称:ifconfig 网卡名称 ip 子网 其修改只是临时生效,一旦关机或重启命令失效,需要修改配置文件永久生效. 2.网卡 ...
- etcd -> Highly-avaliable key value store for shared configuration and service discovery
The name "etcd" originated from two ideas, the unix "/etc" folder and "d&qu ...
- Docker 搭建本地Registry
Docker已经将Registry开源,Registry本身也是一个容器. 1. 修改配置/etc/docker/daemon.json,去掉docker默认的https的访问 里面的内容是一个j ...
- curl 监控web
[root@rhel6 ~]# curl -I -s -w "%{http_code}\n" -o /dev/null http://127.0.0.1 [root@rhel6 ~ ...
- shell 定义变量
注意定义变量的语法: var="ABC" 等号之间不能有空格,否则会报错
- mac下搭建前端自动化工程
好多年没有接触前端,发现前端行业发生了巨大的变化,很多新鲜术语,比如node.git.grunt.less.sass.预编译.自动化.模块化等等,看得让人晕头转向,不要担心,我会把这之前之后学习成果都 ...