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 ...
随机推荐
- 阿里云服务(一) OSS
阿里电子商务迄今是中国最大的电商网站,各个厂商都在去模仿.就像google的大数据处理,Hadoop的思想等等,只有做出了一些成绩,起了带头羊,那么将会是非常吃香的.从今天开始简单学习了解一下阿里的各 ...
- linux系统环境下搭建coreseek(+mmseg3) (good)
1.下载并解压coreseek软件,操作命令如下: wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz 说明:文件下 ...
- 让你快速上手Runtime(转)
前言 本篇主要介绍Runtime在开发中的一些使用场景,顺便讲解了下MJExtension的底层实现.如果喜欢我的文章,可以关注我微博:袁峥Seemygo,也可以来小码哥,了解下我们的iOS培训课程. ...
- python 批量修改预定字符串并将修改后的字符串插入文件指定位置
下面的例子是在文件的指定位置增加指定字符串的例子 修改配置文件: def add_str(pre_str): lines = [] flag = True f = open("z.txt&q ...
- Data Structure Array: Sort elements by frequency
http://www.geeksforgeeks.org/sort-elements-by-frequency-set-2/ #include <iostream> #include &l ...
- nginx日志配置,以及日志轮询
一.为nginx配置错误日志 Nginx错误日志是调试nginx的重要手段,属于核心功能模块的参数(ngx_core_module)该参数名字为err_log,是放在Main区块中全局配置 err_l ...
- /dev/sda
/dev/sda这是Linux系统下的设备文件,类似Windows系统上面的本地磁盘.U盘.光驱等设备.Linux系统访问设备文件需要mount命令挂载映射成文件,查看: 1.建一个目录(挂载磁盘分区 ...
- python3全方位教程
http://www.runoob.com/python3/python3-tutorial.html http://www.runoob.com/
- python中的enumerate()函数用法
enumerate函数用于遍历序列中的元素以及它们的下标,可以非常方便的遍历元素. 比如我在往excel中写数据时就用到了这个函数: data = [] data.append(('预约码', '车牌 ...
- linux命令学习笔记(0):man命令
Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可. Linux的man手册共有以下几个章节: 代號 代表內容 使用者在shell中可以操作的指令或可执行 ...