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 ...
随机推荐
- activiti 基础搭建
首先在eclipse内添加activiti的插件,https://blog.csdn.net/qq_22701869/article/details/79537971 1.创建一个maven的java ...
- PHP eval函数使用介绍
eval()函数中的eval是evaluate的简称,这个函数的作用就是把一段字符串当作PHP语句来执行. 复制代码代码如下: eval("echo'hello world';") ...
- LeetCode:移除K位数字【402】
LeetCode:移除K位数字[402] 题目描述 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. nu ...
- rails 注释
view -# js.erb <%# xxxx %> 单行注释
- ios 表情编码
感受 :可以做自定义键盘时候用 很方便 还可以在textView里面看到 用户体验很好~ 但是要和服务器管理员协商好,做好解析转码工作,不然网页上是不显示的. ios表情编码 在ios中可以使用可爱 ...
- action extension添加图标
最近在做ios的action extension,这里记录一下添加图标的方法. 在Action Extension的target里面的Build Settings,里面的Asset Catalog C ...
- springboot5
1.改造购物车系统 1.1.创建购物车的Spring Boot工程 1.1.导入依赖 <project xmlns="http://maven.apache.org/POM/4.0.0 ...
- 第三章 python中的字符串
一.字符串的基本操作 所有标准的序列操作对字符串同样适用,如索引.分片.乘法.判断成员是否存在.求长度.最大值和最小值等.记住一点,字符串是不可变的. 二.字符串中重要的方法 1.find(subst ...
- Wildfly在Linux下以Service的方式启动 配置步骤
1.前提介绍 在目前项目中使用Wildfly9在linux下部署项目,经常会通过远程的SSH来启动关闭服务.但是通过SHH启动 standalone.sh 的服务,如果关闭窗口服务就会被停掉.所以就想 ...
- EntityFramework 学习 一 Entity Lifecycle 实体生命周期
当我们执行CRUD(Create,Read,Update,Delete)操作之前,最重要的是搞明白实体的生命周期和EntityFrameword怎么管理实体 在一个实体的生命周期里,每个实体都有一个实 ...