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
|
||
|
||
}
|
||
}
|