309 lines
7.2 KiB
C#
309 lines
7.2 KiB
C#
|
/*
|
|||
|
* 本代码受中华人民共和国著作权法保护,作者仅授权下载代码之人在学习和交流范围内
|
|||
|
* 自由使用与修改代码;欲将代码用于商业用途的,请与作者联系。
|
|||
|
* 使用本代码请保留此处信息。作者联系方式:ping3108@163.com, 欢迎进行技术交流
|
|||
|
*/
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Drawing;
|
|||
|
using System.Drawing.Drawing2D;
|
|||
|
using System.ComponentModel;
|
|||
|
using System.Windows.Forms;
|
|||
|
|
|||
|
using MGdu.WinFormUI.MyGraphics;
|
|||
|
//忽略没有注释警告
|
|||
|
#pragma warning disable 1591
|
|||
|
namespace MGdu.WinFormUI
|
|||
|
{
|
|||
|
[ToolboxItem(true)]
|
|||
|
public class GMRollingBar : GMBarControlBase, IGMControl
|
|||
|
{
|
|||
|
|
|||
|
#region 构造函数及初始化
|
|||
|
|
|||
|
public GMRollingBar()
|
|||
|
{
|
|||
|
rollingTimer = new Timer();
|
|||
|
rollingTimer.Tick += new EventHandler(rollingTimer_Tick);
|
|||
|
rollingTimer.Interval = _refleshFrequency;
|
|||
|
rollingTimer.Enabled = false;
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region private var
|
|||
|
|
|||
|
float currentAngle = 0f;
|
|||
|
|
|||
|
Timer rollingTimer;
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region IGMControl实现
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public GMControlType ControlType
|
|||
|
{
|
|||
|
get { return GMControlType.RollingBar; }
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 新增的公开属性
|
|||
|
|
|||
|
GMRollingBarThemeBase _xtheme;
|
|||
|
RollingBarStyle _style;
|
|||
|
int _refleshFrequency = 150;
|
|||
|
|
|||
|
[DefaultValue(150)]
|
|||
|
public int RefleshFrequency
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _refleshFrequency;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
if (_refleshFrequency != value)
|
|||
|
{
|
|||
|
if (value < 1)
|
|||
|
value = 150;
|
|||
|
_refleshFrequency = value;
|
|||
|
rollingTimer.Interval = _refleshFrequency;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
[DefaultValue(typeof(RollingBarStyle),"0")]
|
|||
|
public RollingBarStyle Style
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _style;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
if (_style != value)
|
|||
|
{
|
|||
|
_style = value;
|
|||
|
Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public GMRollingBarThemeBase XTheme
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _xtheme;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_xtheme = value;
|
|||
|
Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 公开的方法
|
|||
|
|
|||
|
public void StartRolling()
|
|||
|
{
|
|||
|
if (rollingTimer.Enabled)
|
|||
|
return;
|
|||
|
rollingTimer.Enabled = true;
|
|||
|
}
|
|||
|
|
|||
|
public void StopRolling()
|
|||
|
{
|
|||
|
rollingTimer.Enabled = false;
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 可用XTheme配置的属性
|
|||
|
|
|||
|
protected virtual int Radius1
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_xtheme == null)
|
|||
|
return 10;
|
|||
|
else
|
|||
|
return _xtheme.Radius1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected virtual int Radius2
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_xtheme == null)
|
|||
|
return 24;
|
|||
|
else
|
|||
|
return _xtheme.Radius2;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected virtual int SpokeNum
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_xtheme == null)
|
|||
|
return 12;
|
|||
|
else
|
|||
|
return _xtheme.SpokeNum;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected virtual float PenWidth
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_xtheme == null)
|
|||
|
return 2;
|
|||
|
else
|
|||
|
return _xtheme.PenWidth;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected virtual Color BaseColor
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_xtheme == null)
|
|||
|
return Color.Red;
|
|||
|
else
|
|||
|
return _xtheme.BaseColor;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected virtual Color GMBackColor
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_xtheme == null)
|
|||
|
return Color.Transparent;
|
|||
|
else
|
|||
|
return _xtheme.BackColor;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 内部方法
|
|||
|
|
|||
|
private void rollingTimer_Tick(object sender, EventArgs e)
|
|||
|
{
|
|||
|
base.Invalidate();
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 内部绘图
|
|||
|
|
|||
|
protected virtual void PaintThisRollingBar(Graphics g)
|
|||
|
{
|
|||
|
switch (Style)
|
|||
|
{
|
|||
|
case RollingBarStyle.Default:
|
|||
|
PaintDefault(g);
|
|||
|
break;
|
|||
|
|
|||
|
case RollingBarStyle.ChromeOneQuarter:
|
|||
|
PaintChromeOneQuarter(g);
|
|||
|
break;
|
|||
|
|
|||
|
case RollingBarStyle.DiamondRing:
|
|||
|
PaintDiamondRing(g);
|
|||
|
break;
|
|||
|
|
|||
|
case RollingBarStyle.BigGuyLeadsLittleGuys:
|
|||
|
PaintTheseGuys(g);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void IncreaseCurrentAngle(int spokeNum)
|
|||
|
{
|
|||
|
if (rollingTimer.Enabled)
|
|||
|
{
|
|||
|
currentAngle += 360f / spokeNum;
|
|||
|
if (currentAngle > 360f)
|
|||
|
currentAngle -= 360f;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void PaintDefault(Graphics g)
|
|||
|
{
|
|||
|
IncreaseCurrentAngle(SpokeNum);
|
|||
|
|
|||
|
RollingBarPainter.RenderDefault(
|
|||
|
g,
|
|||
|
ClientRectangle,
|
|||
|
GMBackColor,
|
|||
|
currentAngle,
|
|||
|
Radius1,
|
|||
|
Radius2,
|
|||
|
SpokeNum,
|
|||
|
PenWidth,
|
|||
|
ColorHelper.GetLighterArrayColors(BaseColor, SpokeNum));
|
|||
|
}
|
|||
|
|
|||
|
private void PaintChromeOneQuarter(Graphics g)
|
|||
|
{
|
|||
|
IncreaseCurrentAngle(10);
|
|||
|
|
|||
|
RollingBarPainter.RenderChromeOneQuarter(
|
|||
|
g,
|
|||
|
ClientRectangle,
|
|||
|
GMBackColor,
|
|||
|
currentAngle,
|
|||
|
Radius1,
|
|||
|
BaseColor);
|
|||
|
}
|
|||
|
|
|||
|
private void PaintDiamondRing(Graphics g)
|
|||
|
{
|
|||
|
IncreaseCurrentAngle(12);
|
|||
|
|
|||
|
RollingBarPainter.RenderDiamondRing(
|
|||
|
g,
|
|||
|
ClientRectangle,
|
|||
|
GMBackColor,
|
|||
|
currentAngle,
|
|||
|
Radius1,
|
|||
|
BaseColor,
|
|||
|
_xtheme == null ? Color.White : _xtheme.DiamondColor);
|
|||
|
}
|
|||
|
|
|||
|
private void PaintTheseGuys(Graphics g)
|
|||
|
{
|
|||
|
IncreaseCurrentAngle(10);
|
|||
|
|
|||
|
RollingBarPainter.RenderTheseGuys(
|
|||
|
g,
|
|||
|
ClientRectangle,
|
|||
|
GMBackColor,
|
|||
|
currentAngle,
|
|||
|
Radius1,
|
|||
|
BaseColor);
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 重写基类方法
|
|||
|
|
|||
|
protected override void OnPaint(PaintEventArgs e)
|
|||
|
{
|
|||
|
base.OnPaint(e);
|
|||
|
PaintThisRollingBar(e.Graphics);
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
}
|
|||
|
}
|