我想實作半圓形進度條,但我在visual studio中沒有足夠的經驗,我確實找到了一個圓形進度條Nuget包,可以做完整的圓形,但我找不到成功制作的方法一半(甚至試圖修改 CircularProgressBar Nuget 包的源代碼),是否有人可以提供提示或實作方法。謝謝。

uj5u.com熱心網友回復:

您可以創建子類并創建自定義半圓進度控制元件。您需要做的只是基于 180° 的計算和繪圖,而不是 360°。
從Label控制元件派生一個新類并匯入:
using System;
using System.Drawing;
using System.Drawing.Design;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.ComponentModel;
并封裝:
- 進度控制的關鍵特性,
Value,Minimum,和Maximum。 - 用于繪制進度、軌道大小、軌道和值顏色的屬性。
- 自定義事件以通知訂閱者值的變化。
- 呼叫
Graphics.DrawArc方法繪制軌跡和值弧的繪圖例程。
[DesignerCategory("Code")]
[DefaultProperty("Value")]
[DefaultEvent("ValueChanged")]
[ToolboxItem(typeof(ToolboxItem))]
[ToolboxBitmap(typeof(ProgressBar))]
public class SemiCircleProgress : Label
{
#region ctor
public SemiCircleProgress() : base() { }
#endregion
#region Properties
private int _value;
[DefaultValue(0)]
public int Value
{
get => _value;
set
{
if (_value != value)
{
_value = value < Minimum ? Minimum : value > Maximum ? Maximum : value;
Invalidate();
OnValueChanged(new EventArgs());
}
}
}
private int _min;
[DefaultValue(0)]
public int Minimum
{
get => _min;
set
{
if (_min != value)
{
_min = Math.Max(value, 0);
if (value > _value) _value = value;
if (value > _max) _max = value;
Invalidate();
}
}
}
private int _max = 100;
[DefaultValue(100)]
public int Maximum
{
get => _max;
set
{
if (_max != value)
{
if (value < 1) value = 1;
if (value < _value) _value = value;
_max = value;
Invalidate();
}
}
}
private int _trackSize = 10;
[DefaultValue(10)]
public int TrackSize
{
get => _trackSize;
set
{
if (_trackSize != value)
{
_trackSize = value;
Invalidate();
}
}
}
private Color _trackColor = Color.Gray;
[DefaultValue(typeof(Color), "Gray")]
public Color TrackColor
{
get => _trackColor;
set
{
if (_trackColor != value)
{
_trackColor = value;
Invalidate();
}
}
}
private Color _valueColor = Color.FromArgb(255, 128, 0);
[DefaultValue(typeof(Color), "255, 128, 0")]
public Color ValueColor
{
get => _valueColor;
set
{
if (_valueColor != value)
{
_valueColor = value;
Invalidate();
}
}
}
private bool _showValue;
[DefaultValue(false)]
public bool ShowValue
{
get => _showValue;
set
{
if (_showValue != value)
{
_showValue = value;
Invalidate();
}
}
}
protected override Size DefaultSize => new Size(100, 100);
#endregion
#region Paint
protected override void OnPaint(PaintEventArgs e)
{
var g = e.Graphics;
var r = new Rectangle(_trackSize, _trackSize,
Math.Max(_trackSize * 2, Width - _trackSize * 2),
Math.Max(_trackSize * 2, (Height - _trackSize * 2) * 2));
using (var pnTrack = new Pen(_trackColor, _trackSize))
{
g.Clear(BackColor);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.PixelOffsetMode = PixelOffsetMode.Half;
g.DrawArc(pnTrack, r, 180, 180);
if (Value > Minimum)
{
var val = (int)Math.Round(180d / Maximum * Value);
pnTrack.Color = _valueColor;
// pnTrack.Width -= 2; // uncomment and try...
g.DrawArc(pnTrack, r, 180, val);
}
}
if (_showValue)
{
TextRenderer.DrawText(g, Value.ToString(), Font, r, ForeColor,
TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
}
}
#endregion
#region Events
public event EventHandler ValueChanged;
protected virtual void OnValueChanged(EventArgs e) =>
ValueChanged?.Invoke(this, e);
#endregion
}
ToDo :隱藏基類未使用的屬性:
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override string Text { get => base.Text; set => base.Text = value; }
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new Image Image { get; set; }
// ...etc.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/373140.html
