You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
4.6 KiB
163 lines
4.6 KiB
#if NETFX || NETCORE
|
|
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Windows.Forms;
|
|
|
|
namespace Apewer.Surface
|
|
{
|
|
|
|
/// <summary>块状进度条。</summary>
|
|
public partial class BlockProgress : BaseControl
|
|
{
|
|
|
|
private Color _normalborder = FormsUtility.GraceBorder;
|
|
private Color _normalblock = FormsUtility.GraceBorder;
|
|
private Color _hoverborder = FormsUtility.GraceSilver;
|
|
private Color _hoverblock = FormsUtility.GraceBorder;
|
|
|
|
private int _max = 1;
|
|
private int _value = 0;
|
|
private bool _hover = false;
|
|
|
|
/// <summary></summary>
|
|
public BlockProgress()
|
|
{
|
|
this.Size = new Size(200, 40);
|
|
DrawProgress();
|
|
this.Resize += Event_This_Resize;
|
|
this.MouseMove += Event_This_MouseMove;
|
|
this.MouseLeave += Event_This_MouseLeave;
|
|
}
|
|
|
|
private void Event_This_MouseLeave(object sender, EventArgs e)
|
|
{
|
|
Hover = false;
|
|
}
|
|
|
|
private void Event_This_MouseMove(object sender, MouseEventArgs e)
|
|
{
|
|
Hover = true;
|
|
}
|
|
|
|
private void Event_This_Resize(object sender, EventArgs e)
|
|
{
|
|
DrawProgress();
|
|
}
|
|
|
|
private bool Hover
|
|
{
|
|
get { return _hover; }
|
|
set
|
|
{
|
|
if (_hover != value)
|
|
{
|
|
_hover = value;
|
|
DrawProgress();
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>当前进度值。</summary>
|
|
public int Value
|
|
{
|
|
get { return _value; }
|
|
set
|
|
{
|
|
_value = (value < 0) ? 0 : ((value > _max) ? _max : value);
|
|
DrawProgress();
|
|
}
|
|
}
|
|
|
|
/// <summary>最大进度值。</summary>
|
|
public int Max
|
|
{
|
|
get { return _max; }
|
|
set
|
|
{
|
|
_max = (value > 0) ? value : 1;
|
|
if (_value >= _max) _value = value;
|
|
DrawProgress();
|
|
}
|
|
}
|
|
|
|
/// <summary>增加当前进度值,不会超过最大进度值。</summary>
|
|
public void Plus()
|
|
{
|
|
Plus(1);
|
|
}
|
|
|
|
/// <summary>增加当前进度值,不会超过最大进度值。</summary>
|
|
/// <param name="step">进度步长值。</param>
|
|
public void Plus(int step)
|
|
{
|
|
Value = Value + 1;
|
|
}
|
|
|
|
private void DrawProgress()
|
|
{
|
|
if (this.IsHandleCreated)
|
|
{
|
|
this.BeginInvoke(new Invoker(delegate () { DrawImage(); }));
|
|
}
|
|
else
|
|
{
|
|
DrawImage();
|
|
}
|
|
}
|
|
|
|
private void DrawImage()
|
|
{
|
|
if (this.Width < 1) return;
|
|
if (this.Height < 1) return;
|
|
|
|
var vbitmap = new Bitmap(this.Width, this.Height);
|
|
using (var vgraphic = Graphics.FromImage(vbitmap))
|
|
{
|
|
vgraphic.SmoothingMode = SmoothingMode.HighSpeed;
|
|
vgraphic.CompositingMode = CompositingMode.SourceCopy;
|
|
if ((this.Width >= 3) && (this.Height >= 3))
|
|
{
|
|
vgraphic.Clear(Color.White);
|
|
using (var vpen = new Pen(Hover ? _hoverborder : _normalborder))
|
|
{
|
|
vgraphic.DrawRectangle(vpen, 0, 0, this.Width - 1, this.Height - 1);
|
|
}
|
|
if ((this.Width >= 5) && (this.Height >= 5))
|
|
{
|
|
int vwidth;
|
|
if (Value == 0) vwidth = 0;
|
|
else
|
|
{
|
|
if (Value == Max) vwidth = this.Width - 4;
|
|
else vwidth = (int)(((float)Value / (float)Max) * (float)(this.Width - 4));
|
|
}
|
|
using (var vbrush = new SolidBrush(Hover ? _hoverblock : _normalblock))
|
|
{
|
|
vgraphic.FillRectangle(vbrush, 2, 2, vwidth, this.Height - 4);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
vgraphic.Clear(Hover ? _hoverblock : _normalblock);
|
|
}
|
|
}
|
|
ProgressImage = vbitmap;
|
|
}
|
|
|
|
private Image ProgressImage
|
|
{
|
|
set
|
|
{
|
|
if (this.BackgroundImage != null) this.BackgroundImage.Dispose();
|
|
this.BackgroundImage = value;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|