227 lines
7.1 KiB
C#
227 lines
7.1 KiB
C#
using System;
|
|||
|
|
using System.Collections.Generic;
|
||
|
|
using System.ComponentModel;
|
||
|
|
using System.Diagnostics;
|
||
|
|
using System.Drawing;
|
||
|
|
using System.Drawing.Drawing2D;
|
||
|
|
using System.Linq;
|
||
|
|
using System.Text;
|
||
|
|
using System.Threading.Tasks;
|
||
|
|
using System.Windows.Forms;
|
||
|
|
|
||
|
|
namespace JinYuan.ControlLib
|
||
|
|
{
|
||
|
|
public partial class CircleProgramBar : Control
|
||
|
|
{
|
||
|
|
public CircleProgramBar()
|
||
|
|
{
|
||
|
|
|
||
|
|
//设置控件样式,去除缓冲
|
||
|
|
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
|
||
|
|
this.SetStyle(ControlStyles.DoubleBuffer, true);
|
||
|
|
this.SetStyle(ControlStyles.ResizeRedraw, true);
|
||
|
|
this.SetStyle(ControlStyles.Selectable, true);
|
||
|
|
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
|
||
|
|
|
||
|
|
InitControl();
|
||
|
|
this.SizeChanged += delegate
|
||
|
|
{
|
||
|
|
this.Invalidate(); //重绘控件
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
#region 减少闪烁
|
||
|
|
protected override CreateParams CreateParams
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
CreateParams cp = base.CreateParams;
|
||
|
|
cp.ExStyle |= 0x02000000;
|
||
|
|
return cp;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
#endregion
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 初始化控件参数
|
||
|
|
/// </summary>
|
||
|
|
private void InitControl()
|
||
|
|
{
|
||
|
|
this.Width = 200;
|
||
|
|
this.Height = 200;
|
||
|
|
}
|
||
|
|
|
||
|
|
private Color bgColor = Color.FromArgb(224, 224, 224);
|
||
|
|
[Browsable(true)]//是否可见
|
||
|
|
[Category("自定义属性")] //类别
|
||
|
|
[Description("设置或显示背景边框颜色")]
|
||
|
|
public Color BgColor
|
||
|
|
{
|
||
|
|
get { return this.bgColor; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
this.bgColor = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private Color sectorColor = Color.FromArgb(109, 179, 63);
|
||
|
|
[Browsable(true)]//是否可见
|
||
|
|
[Category("自定义属性")] //类别
|
||
|
|
[Description("设置或显示扇形颜色")]
|
||
|
|
public Color SectorColor
|
||
|
|
{
|
||
|
|
get { return this.sectorColor; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
this.sectorColor = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private int borderWidth = 5;
|
||
|
|
[Browsable(true)]//是否可见
|
||
|
|
[Category("自定义属性")] //类别
|
||
|
|
[Description("设置或显示边框宽度")]
|
||
|
|
public int BorderWidth
|
||
|
|
{
|
||
|
|
get { return this.borderWidth; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
this.borderWidth = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private int maxValue = 100;
|
||
|
|
[Browsable(true)]//是否可见
|
||
|
|
[Category("自定义属性")] //类别
|
||
|
|
[Description("设置或显示进度最大值")]
|
||
|
|
public int MaxValue
|
||
|
|
{
|
||
|
|
get { return this.maxValue; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
this.maxValue = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
private bool isShowDataType = false;
|
||
|
|
[Browsable(true)]//是否可见
|
||
|
|
[Category("自定义属性")] //类别
|
||
|
|
[Description("设置显示数值是小数还是整数")]
|
||
|
|
public bool IsShowDataType
|
||
|
|
{
|
||
|
|
get { return this.isShowDataType; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
this.isShowDataType = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
private int intValue = 0;
|
||
|
|
[Browsable(true)]//是否可见
|
||
|
|
[Category("自定义属性")] //类别
|
||
|
|
[Description("设置或显示整数进度值")]
|
||
|
|
public int IntValue
|
||
|
|
{
|
||
|
|
get { return this.intValue; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
if (value > this.maxValue)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
this.intValue = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private int floatValue = 0;
|
||
|
|
[Browsable(true)]//是否可见
|
||
|
|
[Category("自定义属性")] //类别
|
||
|
|
[Description("设置或显示小数进度值")]
|
||
|
|
public int FloatValue
|
||
|
|
{
|
||
|
|
get { return this.floatValue; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
if (value > this.maxValue)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
this.floatValue = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
private bool setShowsign = false;
|
||
|
|
[Browsable(true)]//是否可见
|
||
|
|
[Category("自定义属性")] //类别
|
||
|
|
[Description("设置或显示百分号,显示百分号需要设置MaxValue值为100")]
|
||
|
|
public bool SetShowsign
|
||
|
|
{
|
||
|
|
get { return this.setShowsign; }
|
||
|
|
set
|
||
|
|
{
|
||
|
|
if (this.maxValue>100)
|
||
|
|
{
|
||
|
|
this.maxValue = 100;
|
||
|
|
}
|
||
|
|
this.setShowsign = value;
|
||
|
|
this.Invalidate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//对Control进行绘制
|
||
|
|
protected override void OnPaint(PaintEventArgs e)
|
||
|
|
{
|
||
|
|
base.OnPaint(e);
|
||
|
|
|
||
|
|
if (this.Width < borderWidth * 4 || this.Height < borderWidth * 4)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
var g = e.Graphics;
|
||
|
|
g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿,也就是抗锯齿什么鬼东西
|
||
|
|
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||
|
|
g.CompositingQuality = CompositingQuality.HighQuality;
|
||
|
|
|
||
|
|
|
||
|
|
RectangleF bg_rectangle = new RectangleF(0 + borderWidth, 0 + borderWidth, Width - borderWidth * 2, Height - borderWidth * 2); //控件整体坐标
|
||
|
|
|
||
|
|
g.DrawEllipse(new Pen(bgColor, borderWidth), bg_rectangle); //画背景圆
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
Rectangle rl = new Rectangle(0 + borderWidth * 2, 0 + borderWidth * 2, this.Width - borderWidth * 4, this.Height - borderWidth * 4);
|
||
|
|
|
||
|
|
decimal topAngle = (isShowDataType? this.floatValue : this.intValue * 1.0M / this.maxValue) * 360M;//计算进度条划过的度数
|
||
|
|
g.FillPie(new SolidBrush(sectorColor), rl, 0, (float)topAngle); //填充扇形
|
||
|
|
|
||
|
|
if (this.setShowsign)
|
||
|
|
{
|
||
|
|
SizeF proValSize = g.MeasureString(isShowDataType ? this.floatValue.ToString() : this.intValue.ToString() + "%", this.Font);//计算文字的范围
|
||
|
|
|
||
|
|
g.DrawString(isShowDataType ? this.floatValue.ToString() : this.intValue.ToString() + "%", this.Font, new SolidBrush(this.ForeColor),
|
||
|
|
|
||
|
|
bg_rectangle.X + bg_rectangle.Width / 2 - proValSize.Width / 2, bg_rectangle.Y + bg_rectangle.Height / 2 - proValSize.Height / 2);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
SizeF proValSize = g.MeasureString(isShowDataType ? this.floatValue.ToString() : this.intValue.ToString(), this.Font);//计算文字的范围
|
||
|
|
|
||
|
|
g.DrawString(isShowDataType ? this.floatValue.ToString() : this.intValue.ToString(), this.Font, new SolidBrush(this.ForeColor),
|
||
|
|
bg_rectangle.X + bg_rectangle.Width / 2 - proValSize.Width / 2, bg_rectangle.Y + bg_rectangle.Height / 2 - proValSize.Height / 2);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|