RaUI/Source/ryControls/Gdu.WinFormUI/GMControls/ProgressBar/GMProgressBar.cs
鑫Intel 5d65c76f05 ### 2021-12-14更新
------
#### MyDbV4    V3.0.2112.1401
- *.[修复]修复MSSQL的ExecuteNonQuery函数可能因为报错导致软件崩溃的BUG。
2021-12-14 09:37:57 +08:00

424 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 本代码受中华人民共和国著作权法保护,作者仅授权下载代码之人在学习和交流范围内
* 自由使用与修改代码;欲将代码用于商业用途的,请与作者联系。
* 使用本代码请保留此处信息。作者联系方式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
}
}