RaUI/Source/ryControls/Gdu.WinFormUI/GMControls/ProgressBar/GMProgressBar.cs

424 lines
11 KiB
C#
Raw Normal View History

/*
*
* 使
* 使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 GMProgressBar : GMBarControlBase, IGMControl
{
#region
public GMProgressBar()
{
}
#endregion
#region private var
string text = "0%";
#endregion
#region IGMControl实现
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public GMControlType ControlType
{
get { return GMControlType.ProgressBar; }
}
#endregion
#region
double _percentage = 0;
bool _showPercentageText = true;
GMProgessBarThemeBase _xtheme;
ProgressBarShapeStyle _shap = ProgressBarShapeStyle.Rectangle;
[DefaultValue(0), Description("0-100之间的double值表示当前进度")]
public double Percentage
{
get
{
return _percentage;
}
set
{
if (_percentage != value)
{
if (value < 0)
value = 0;
if (value > 100)
value = 100;
_percentage = value;
text = _percentage.ToString("0.00").Replace(".00","") + "%";
Invalidate();
}
}
}
/// <summary>
/// 设置百分比
/// </summary>
/// <param name="value"></param>
/// <param name="min"></param>
/// <param name="max"></param>
/// <returns></returns>
public double SetPercent(int value,int min,int max)
{
if (max <= min) { Percentage = 100; }
else if (value <= min) { Percentage = 0; }
else if (value >= max) { Percentage = 100; }
else { Percentage = (value - min)*100 / (double)(max - min); }
return Percentage;
}
[DefaultValue(true)]
public bool ShowPercentageText
{
get
{
return _showPercentageText;
}
set
{
if (_showPercentageText != value)
{
_showPercentageText = value;
Invalidate();
}
}
}
[Description("表示进度条是长方形的还是圆形的"),DefaultValue(typeof(ProgressBarShapeStyle),"0")]
public ProgressBarShapeStyle Shape
{
get
{
return _shap;
}
set
{
if (_shap != value)
{
_shap = value;
Invalidate();
}
}
}
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public GMProgessBarThemeBase XTheme
{
get
{
return _xtheme;
}
set
{
_xtheme = value;
Invalidate();
}
}
#endregion
#region XTheme配置的属性
protected virtual Color GMBackColor
{
get
{
if (_xtheme == null)
return Color.White;
else
return _xtheme.BackColor;
}
}
protected virtual Color InnerBorderColor
{
get
{
if (_xtheme == null)
return Color.White;
else
return _xtheme.InnerBorderColor;
}
}
protected virtual Color BorderColor
{
get
{
if (_xtheme == null)
return Color.FromArgb(171, 171, 171);
else
return _xtheme.BorderColor;
}
}
protected virtual Color CoveredColor
{
get
{
if (_xtheme == null)
return Color.FromArgb(0, 114, 198);
else
return _xtheme.CoveredColor;
}
}
protected virtual Color LeadingEdgeColor
{
get
{
if (_xtheme == null)
return Color.Empty;
else
return _xtheme.LeadingEdgeColor;
}
}
protected virtual bool DrawInnerBorder
{
get
{
if (_xtheme == null)
return true;
else
return _xtheme.DrawInnerBorder;
}
}
protected virtual bool DrawLeadingEdge
{
get
{
if (_xtheme == null)
return false;
else
return _xtheme.DrawLeadingEdge;
}
}
protected virtual bool DrawBackColorGlass
{
get
{
if (_xtheme == null)
return false;
else
return _xtheme.DrawBackColorGlass;
}
}
protected virtual bool DrawCoveredColorGlass
{
get
{
if (_xtheme == null)
return false;
else
return _xtheme.DrawCoveredColorGlass;
}
}
protected virtual int BorderRadius
{
get
{
if (_xtheme == null)
return 0;
else
return _xtheme.BorderRadius;
}
}
protected virtual Color GMForeColor
{
get
{
if (_xtheme == null)
return base.ForeColor;
else
return _xtheme.ForeColor;
}
}
protected virtual Font ForeFont
{
get
{
if (_xtheme == null)
return base.Font;
else
return _xtheme.ForeFont;
}
}
#endregion
#region
private Rectangle CoveredRect
{
get
{
Point location = ClientRectangle.Location;
int maxWidth, height, width;
if (DrawInnerBorder)
{
maxWidth = base.Width - 4;
height = base.Height - 4;
location.Offset(2, 2);
}
else
{
maxWidth = base.Width - 2;
height = base.Height - 2;
location.Offset(1, 1);
}
width = (int)((float)maxWidth * (float)Percentage / 100f);
return new Rectangle(location, new Size(width, height));
}
}
#endregion
#region
protected virtual void PaintThisBar(Graphics g)
{
BasicBlockPainter.RenderFlatBackground(g, ClientRectangle, GMBackColor,
ButtonBorderType.Rectangle, BorderRadius, RoundStyle.All);
if (DrawBackColorGlass)
BasicBlockPainter.RenderRectangleGlass(g, ClientRectangle, BorderRadius, RoundStyle.All,
RectangleGlassPosition.Bottom, 270f, 0.5f, Color.White, 100, 20);
Rectangle rectCover = CoveredRect;
if (rectCover.Width > 0)
{
rectCover.Inflate(1, 1);
BasicBlockPainter.RenderFlatBackground(g, rectCover, CoveredColor,
ButtonBorderType.Rectangle, BorderRadius, RoundStyle.All);
if (DrawCoveredColorGlass)
BasicBlockPainter.RenderRectangleGlass(g, rectCover, BorderRadius, RoundStyle.All,
RectangleGlassPosition.Top, 90.001f);
}
if (DrawLeadingEdge && Percentage != 100)
{
rectCover.Inflate(-1, -1);
Point p1 = new Point(rectCover.Right - 1 + 1, rectCover.Y);
Point p2 = new Point(rectCover.Right - 1 + 1, rectCover.Bottom - 1);
using (Pen p = new Pen(LeadingEdgeColor))
{
g.DrawLine(p, p1, p2);
}
}
if (ShowPercentageText)
{
TextRenderer.DrawText(g, text, ForeFont, ClientRectangle, ForeColor,
TextFormatFlags.HorizontalCenter |
TextFormatFlags.VerticalCenter);
}
Rectangle rectBorder = ClientRectangle;
BasicBlockPainter.RenderBorder(g, rectBorder, BorderColor, ButtonBorderType.Rectangle,
BorderRadius, RoundStyle.All);
if (DrawInnerBorder)
{
rectBorder.Inflate(-1, -1);
BasicBlockPainter.RenderBorder(g, rectBorder, InnerBorderColor, ButtonBorderType.Rectangle,
BorderRadius, RoundStyle.All);
}
}
protected virtual void PaintThisBarInCircleShape(Graphics g)
{
Rectangle rect;
if (base.Width < base.Height)
{
rect = new Rectangle(0, (Height - Width) / 2, Width, Width);
}
else
{
rect = new Rectangle((Width - Height) / 2, 0, Height, Height);
}
g.FillRectangle(Brushes.Transparent, ClientRectangle);
SimpleObjectPainter.RenderCircleProgressBar(
g,
rect,
CoveredColor,
BorderColor,
GMBackColor,
DrawInnerBorder,
270,
(float)Percentage,
ShowPercentageText,
ForeFont);
}
#endregion
#region
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (Shape == ProgressBarShapeStyle.Circle)
{
PaintThisBarInCircleShape(e.Graphics);
}
else
{
PaintThisBar(e.Graphics);
}
}
[Browsable(true)]
public override System.Drawing.Color ForeColor
{
get
{
return base.ForeColor;
}
set
{
base.ForeColor = value;
}
}
[Browsable(true)]
public override Font Font
{
get
{
return base.Font;
}
set
{
base.Font = value;
}
}
#endregion
}
}