c#中Winform自定义控件如何实现仪表盘功能
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍c#中Winform自定义控件如何实现仪表盘功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!准备工作依然使用GDI+画的,不懂的话就百度一下吧另外主要用到了三
千家信息网最后更新 2025年01月19日c#中Winform自定义控件如何实现仪表盘功能
这篇文章主要介绍c#中Winform自定义控件如何实现仪表盘功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
准备工作
依然使用GDI+画的,不懂的话就百度一下吧
另外主要用到了三角函数,如果不懂,可以向初中的数学老师再问问(你也可以百度一下)
开始
添加一个类UCMeter 继承 UserControl
首先添加一个需要控制的属性
private int splitCount = 10; ////// Gets or sets the split count. /// ///The split count. [Description("分隔刻度数量,>1"), Category("自定义")] public int SplitCount { get { return splitCount; } set { if (value < 1) return; splitCount = value; Refresh(); } } private int meterDegrees = 150; ////// Gets or sets the meter degrees. /// ///The meter degrees. [Description("表盘跨度角度,0-360"), Category("自定义")] public int MeterDegrees { get { return meterDegrees; } set { if (value > 360 || value <= 0) return; meterDegrees = value; Refresh(); } } private decimal minValue = 0; ////// Gets or sets the minimum value. /// ///The minimum value. [Description("最小值,= maxValue) return; minValue = value; Refresh(); } } private decimal maxValue = 100; /// /// Gets or sets the maximum value. /// ///The maximum value. [Description("最大值,>MinValue"), Category("自定义")] public decimal MaxValue { get { return maxValue; } set { if (value <= minValue) return; maxValue = value; Refresh(); } } ////// 获取或设置控件显示的文字的字体。 /// ///The font. ////// [Description("刻度字体"), Category("自定义")] public override Font Font { get { return base.Font; } set { base.Font = value; Refresh(); } } private decimal m_value = 0; ////// /// /// /// /// Gets or sets the value. /// ///The value. [Description("值,>=MinValue并且<=MaxValue"), Category("自定义")] public decimal Value { get { return m_value; } set { if (value < minValue || value > maxValue) return; m_value = value; Refresh(); } } private MeterTextLocation textLocation = MeterTextLocation.None; ////// Gets or sets the text location. /// ///The text location. [Description("值和固定文字显示位置"), Category("自定义")] public MeterTextLocation TextLocation { get { return textLocation; } set { textLocation = value; Refresh(); } } private string fixedText; ////// Gets or sets the fixed text. /// ///The fixed text. [Description("固定文字"), Category("自定义")] public string FixedText { get { return fixedText; } set { fixedText = value; Refresh(); } } private Font textFont = DefaultFont; ////// Gets or sets the text font. /// ///The text font. [Description("值和固定文字字体"), Category("自定义")] public Font TextFont { get { return textFont; } set { textFont = value; Refresh(); } } private Color externalRoundColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the external round. /// ///The color of the external round. [Description("外圆颜色"), Category("自定义")] public Color ExternalRoundColor { get { return externalRoundColor; } set { externalRoundColor = value; Refresh(); } } private Color insideRoundColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the inside round. /// ///The color of the inside round. [Description("内圆颜色"), Category("自定义")] public Color InsideRoundColor { get { return insideRoundColor; } set { insideRoundColor = value; Refresh(); } } private Color boundaryLineColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the boundary line. /// ///The color of the boundary line. [Description("边界线颜色"), Category("自定义")] public Color BoundaryLineColor { get { return boundaryLineColor; } set { boundaryLineColor = value; Refresh(); } } private Color scaleColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the scale. /// ///The color of the scale. [Description("刻度颜色"), Category("自定义")] public Color ScaleColor { get { return scaleColor; } set { scaleColor = value; Refresh(); } } private Color scaleValueColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the scale value. /// ///The color of the scale value. [Description("刻度值文字颜色"), Category("自定义")] public Color ScaleValueColor { get { return scaleValueColor; } set { scaleValueColor = value; Refresh(); } } private Color pointerColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the pointer. /// ///The color of the pointer. [Description("指针颜色"), Category("自定义")] public Color PointerColor { get { return pointerColor; } set { pointerColor = value; Refresh(); } } private Color textColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the text. /// ///The color of the text. [Description("值和固定文字颜色"), Category("自定义")] public Color TextColor { get { return textColor; } set { textColor = value; Refresh(); } } Rectangle m_rectWorking;
重绘
protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); var g = e.Graphics; g.SetGDIHigh(); //外圆 float fltStartAngle = -90 - (meterDegrees) / 2 + 360; var r1 = new Rectangle(m_rectWorking.Location, new Size(m_rectWorking.Width, m_rectWorking.Width)); g.DrawArc(new Pen(new SolidBrush(externalRoundColor), 1), r1, fltStartAngle, meterDegrees); //内圆 var r2 = new Rectangle(m_rectWorking.Left + (m_rectWorking.Width - m_rectWorking.Width / 4) / 2, m_rectWorking.Top + (m_rectWorking.Width - m_rectWorking.Width / 4) / 2, m_rectWorking.Width / 4, m_rectWorking.Width / 4); g.DrawArc(new Pen(new SolidBrush(insideRoundColor), 1), r2, fltStartAngle, meterDegrees); //边界线 if (meterDegrees != 360) { float fltAngle = fltStartAngle - 180; float intY = (float)(m_rectWorking.Top + m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - m_rectWorking.Width / 8) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); float intX = (float)(m_rectWorking.Left + (m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - m_rectWorking.Width / 8) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); float fltY1 = (float)(m_rectWorking.Top + m_rectWorking.Width / 2 - (m_rectWorking.Width / 8 * Math.Sin(Math.PI * (fltAngle / 180.00F)))); float fltX1 = (float)(m_rectWorking.Left + (m_rectWorking.Width / 2 - (m_rectWorking.Width / 8 * Math.Cos(Math.PI * (fltAngle / 180.00F))))); g.DrawLine(new Pen(new SolidBrush(boundaryLineColor), 1), new PointF(intX, intY), new PointF(fltX1, fltY1)); g.DrawLine(new Pen(new SolidBrush(boundaryLineColor), 1), new PointF(m_rectWorking.Right - (fltX1 - m_rectWorking.Left), fltY1), new PointF(m_rectWorking.Right - (intX - m_rectWorking.Left), intY)); } //分割线 int _splitCount = splitCount * 2; float fltSplitValue = (float)meterDegrees / (float)_splitCount; for (int i = 0; i <= _splitCount; i++) { float fltAngle = (fltStartAngle + fltSplitValue * i - 180) % 360; float fltY1 = (float)(m_rectWorking.Top + m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); float fltX1 = (float)(m_rectWorking.Left + (m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); float fltY2 = 0; float fltX2 = 0; if (i % 2 == 0) { fltY2 = (float)(m_rectWorking.Top + m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 10) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); fltX2 = (float)(m_rectWorking.Left + (m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 10) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); if (!(meterDegrees == 360 && i == _splitCount)) { decimal decValue = minValue + (maxValue - minValue) / _splitCount * i; var txtSize = g.MeasureString(decValue.ToString("0.##"), this.Font); float fltFY1 = (float)(m_rectWorking.Top - txtSize.Height / 2 + m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 20) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); float fltFX1 = (float)(m_rectWorking.Left - txtSize.Width / 2 + (m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 20) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); g.DrawString(decValue.ToString("0.##"), Font, new SolidBrush(scaleValueColor), fltFX1, fltFY1); } } else { fltY2 = (float)(m_rectWorking.Top + m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 5) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); fltX2 = (float)(m_rectWorking.Left + (m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 5) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); } g.DrawLine(new Pen(new SolidBrush(scaleColor), i % 2 == 0 ? 2 : 1), new PointF(fltX1, fltY1), new PointF(fltX2, fltY2)); } //值文字和固定文字 if (textLocation != MeterTextLocation.None) { string str = m_value.ToString("0.##"); var txtSize = g.MeasureString(str, textFont); float fltY = m_rectWorking.Top + m_rectWorking.Width / 4 - txtSize.Height / 2; float fltX = m_rectWorking.Left + m_rectWorking.Width / 2 - txtSize.Width / 2; g.DrawString(str, textFont, new SolidBrush(textColor), new PointF(fltX, fltY)); if (!string.IsNullOrEmpty(fixedText)) { str = fixedText; txtSize = g.MeasureString(str, textFont); fltY = m_rectWorking.Top + m_rectWorking.Width / 4 + txtSize.Height / 2; fltX = m_rectWorking.Left + m_rectWorking.Width / 2 - txtSize.Width / 2; g.DrawString(str, textFont, new SolidBrush(textColor), new PointF(fltX, fltY)); } } //画指针 g.FillEllipse(new SolidBrush(Color.FromArgb(100, pointerColor.R, pointerColor.G, pointerColor.B)), new Rectangle(m_rectWorking.Left + m_rectWorking.Width / 2 - 10, m_rectWorking.Top + m_rectWorking.Width / 2 - 10, 20, 20)); g.FillEllipse(Brushes.Red, new Rectangle(m_rectWorking.Left + m_rectWorking.Width / 2 - 5, m_rectWorking.Top + m_rectWorking.Width / 2 - 5, 10, 10)); float fltValueAngle = (fltStartAngle + ((float)(m_value - minValue) / (float)(maxValue - minValue)) * (float)meterDegrees - 180) % 360; float intValueY1 = (float)(m_rectWorking.Top + m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 30) * Math.Sin(Math.PI * (fltValueAngle / 180.00F)))); float intValueX1 = (float)(m_rectWorking.Left + (m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 30) * Math.Cos(Math.PI * (fltValueAngle / 180.00F))))); g.DrawLine(new Pen(new SolidBrush(pointerColor), 3), intValueX1, intValueY1, m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Top + m_rectWorking.Width / 2); }
还有一个显示文字位置的枚举
////// Enum MeterTextLocation /// public enum MeterTextLocation { ////// The none /// None, ////// The top /// Top, ////// The bottom /// Bottom }
代码就这么多了,看完整代码
// ***********************************************************************// Assembly : HZH_Controls// Created : 2019-09-03//// ***********************************************************************//// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com// //// Blog: https://www.cnblogs.com/bfyx// GitHub:https://github.com/kwwwvagaa/NetWinformControl// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git//// If you use this code, please keep this note.// ***********************************************************************using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;using System.Drawing;using System.Drawing.Drawing2D;using System.ComponentModel;namespace HZH_Controls.Controls{ ////// Class UCMeter. /// Implements the ////// public class UCMeter : UserControl { private int splitCount = 10; /// /// Gets or sets the split count. /// ///The split count. [Description("分隔刻度数量,>1"), Category("自定义")] public int SplitCount { get { return splitCount; } set { if (value < 1) return; splitCount = value; Refresh(); } } private int meterDegrees = 150; ////// Gets or sets the meter degrees. /// ///The meter degrees. [Description("表盘跨度角度,0-360"), Category("自定义")] public int MeterDegrees { get { return meterDegrees; } set { if (value > 360 || value <= 0) return; meterDegrees = value; Refresh(); } } private decimal minValue = 0; ////// Gets or sets the minimum value. /// ///The minimum value. [Description("最小值,= maxValue) return; minValue = value; Refresh(); } } private decimal maxValue = 100; /// /// Gets or sets the maximum value. /// ///The maximum value. [Description("最大值,>MinValue"), Category("自定义")] public decimal MaxValue { get { return maxValue; } set { if (value <= minValue) return; maxValue = value; Refresh(); } } ////// 获取或设置控件显示的文字的字体。 /// ///The font. ////// [Description("刻度字体"), Category("自定义")] public override Font Font { get { return base.Font; } set { base.Font = value; Refresh(); } } private decimal m_value = 0; ////// /// /// /// /// Gets or sets the value. /// ///The value. [Description("值,>=MinValue并且<=MaxValue"), Category("自定义")] public decimal Value { get { return m_value; } set { if (value < minValue || value > maxValue) return; m_value = value; Refresh(); } } private MeterTextLocation textLocation = MeterTextLocation.None; ////// Gets or sets the text location. /// ///The text location. [Description("值和固定文字显示位置"), Category("自定义")] public MeterTextLocation TextLocation { get { return textLocation; } set { textLocation = value; Refresh(); } } private string fixedText; ////// Gets or sets the fixed text. /// ///The fixed text. [Description("固定文字"), Category("自定义")] public string FixedText { get { return fixedText; } set { fixedText = value; Refresh(); } } private Font textFont = DefaultFont; ////// Gets or sets the text font. /// ///The text font. [Description("值和固定文字字体"), Category("自定义")] public Font TextFont { get { return textFont; } set { textFont = value; Refresh(); } } private Color externalRoundColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the external round. /// ///The color of the external round. [Description("外圆颜色"), Category("自定义")] public Color ExternalRoundColor { get { return externalRoundColor; } set { externalRoundColor = value; Refresh(); } } private Color insideRoundColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the inside round. /// ///The color of the inside round. [Description("内圆颜色"), Category("自定义")] public Color InsideRoundColor { get { return insideRoundColor; } set { insideRoundColor = value; Refresh(); } } private Color boundaryLineColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the boundary line. /// ///The color of the boundary line. [Description("边界线颜色"), Category("自定义")] public Color BoundaryLineColor { get { return boundaryLineColor; } set { boundaryLineColor = value; Refresh(); } } private Color scaleColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the scale. /// ///The color of the scale. [Description("刻度颜色"), Category("自定义")] public Color ScaleColor { get { return scaleColor; } set { scaleColor = value; Refresh(); } } private Color scaleValueColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the scale value. /// ///The color of the scale value. [Description("刻度值文字颜色"), Category("自定义")] public Color ScaleValueColor { get { return scaleValueColor; } set { scaleValueColor = value; Refresh(); } } private Color pointerColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the pointer. /// ///The color of the pointer. [Description("指针颜色"), Category("自定义")] public Color PointerColor { get { return pointerColor; } set { pointerColor = value; Refresh(); } } private Color textColor = Color.FromArgb(255, 77, 59); ////// Gets or sets the color of the text. /// ///The color of the text. [Description("值和固定文字颜色"), Category("自定义")] public Color TextColor { get { return textColor; } set { textColor = value; Refresh(); } } Rectangle m_rectWorking; public UCMeter() { this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); this.SetStyle(ControlStyles.DoubleBuffer, true); this.SetStyle(ControlStyles.ResizeRedraw, true); this.SetStyle(ControlStyles.Selectable, true); this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); this.SetStyle(ControlStyles.UserPaint, true); this.SizeChanged += UCMeter1_SizeChanged; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.Size = new Size(350, 200); } void UCMeter1_SizeChanged(object sender, EventArgs e) { m_rectWorking = new Rectangle(10, 10, this.Width - 20, this.Height - 20); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); var g = e.Graphics; g.SetGDIHigh(); //外圆 float fltStartAngle = -90 - (meterDegrees) / 2 + 360; var r1 = new Rectangle(m_rectWorking.Location, new Size(m_rectWorking.Width, m_rectWorking.Width)); g.DrawArc(new Pen(new SolidBrush(externalRoundColor), 1), r1, fltStartAngle, meterDegrees); //内圆 var r2 = new Rectangle(m_rectWorking.Left + (m_rectWorking.Width - m_rectWorking.Width / 4) / 2, m_rectWorking.Top + (m_rectWorking.Width - m_rectWorking.Width / 4) / 2, m_rectWorking.Width / 4, m_rectWorking.Width / 4); g.DrawArc(new Pen(new SolidBrush(insideRoundColor), 1), r2, fltStartAngle, meterDegrees); //边界线 if (meterDegrees != 360) { float fltAngle = fltStartAngle - 180; float intY = (float)(m_rectWorking.Top + m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - m_rectWorking.Width / 8) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); float intX = (float)(m_rectWorking.Left + (m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - m_rectWorking.Width / 8) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); float fltY1 = (float)(m_rectWorking.Top + m_rectWorking.Width / 2 - (m_rectWorking.Width / 8 * Math.Sin(Math.PI * (fltAngle / 180.00F)))); float fltX1 = (float)(m_rectWorking.Left + (m_rectWorking.Width / 2 - (m_rectWorking.Width / 8 * Math.Cos(Math.PI * (fltAngle / 180.00F))))); g.DrawLine(new Pen(new SolidBrush(boundaryLineColor), 1), new PointF(intX, intY), new PointF(fltX1, fltY1)); g.DrawLine(new Pen(new SolidBrush(boundaryLineColor), 1), new PointF(m_rectWorking.Right - (fltX1 - m_rectWorking.Left), fltY1), new PointF(m_rectWorking.Right - (intX - m_rectWorking.Left), intY)); } //分割线 int _splitCount = splitCount * 2; float fltSplitValue = (float)meterDegrees / (float)_splitCount; for (int i = 0; i <= _splitCount; i++) { float fltAngle = (fltStartAngle + fltSplitValue * i - 180) % 360; float fltY1 = (float)(m_rectWorking.Top + m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); float fltX1 = (float)(m_rectWorking.Left + (m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); float fltY2 = 0; float fltX2 = 0; if (i % 2 == 0) { fltY2 = (float)(m_rectWorking.Top + m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 10) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); fltX2 = (float)(m_rectWorking.Left + (m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 10) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); if (!(meterDegrees == 360 && i == _splitCount)) { decimal decValue = minValue + (maxValue - minValue) / _splitCount * i; var txtSize = g.MeasureString(decValue.ToString("0.##"), this.Font); float fltFY1 = (float)(m_rectWorking.Top - txtSize.Height / 2 + m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 20) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); float fltFX1 = (float)(m_rectWorking.Left - txtSize.Width / 2 + (m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 20) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); g.DrawString(decValue.ToString("0.##"), Font, new SolidBrush(scaleValueColor), fltFX1, fltFY1); } } else { fltY2 = (float)(m_rectWorking.Top + m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 5) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); fltX2 = (float)(m_rectWorking.Left + (m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 5) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); } g.DrawLine(new Pen(new SolidBrush(scaleColor), i % 2 == 0 ? 2 : 1), new PointF(fltX1, fltY1), new PointF(fltX2, fltY2)); } //值文字和固定文字 if (textLocation != MeterTextLocation.None) { string str = m_value.ToString("0.##"); var txtSize = g.MeasureString(str, textFont); float fltY = m_rectWorking.Top + m_rectWorking.Width / 4 - txtSize.Height / 2; float fltX = m_rectWorking.Left + m_rectWorking.Width / 2 - txtSize.Width / 2; g.DrawString(str, textFont, new SolidBrush(textColor), new PointF(fltX, fltY)); if (!string.IsNullOrEmpty(fixedText)) { str = fixedText; txtSize = g.MeasureString(str, textFont); fltY = m_rectWorking.Top + m_rectWorking.Width / 4 + txtSize.Height / 2; fltX = m_rectWorking.Left + m_rectWorking.Width / 2 - txtSize.Width / 2; g.DrawString(str, textFont, new SolidBrush(textColor), new PointF(fltX, fltY)); } } //画指针 g.FillEllipse(new SolidBrush(Color.FromArgb(100, pointerColor.R, pointerColor.G, pointerColor.B)), new Rectangle(m_rectWorking.Left + m_rectWorking.Width / 2 - 10, m_rectWorking.Top + m_rectWorking.Width / 2 - 10, 20, 20)); g.FillEllipse(Brushes.Red, new Rectangle(m_rectWorking.Left + m_rectWorking.Width / 2 - 5, m_rectWorking.Top + m_rectWorking.Width / 2 - 5, 10, 10)); float fltValueAngle = (fltStartAngle + ((float)(m_value - minValue) / (float)(maxValue - minValue)) * (float)meterDegrees - 180) % 360; float intValueY1 = (float)(m_rectWorking.Top + m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 30) * Math.Sin(Math.PI * (fltValueAngle / 180.00F)))); float intValueX1 = (float)(m_rectWorking.Left + (m_rectWorking.Width / 2 - ((m_rectWorking.Width / 2 - 30) * Math.Cos(Math.PI * (fltValueAngle / 180.00F))))); g.DrawLine(new Pen(new SolidBrush(pointerColor), 3), intValueX1, intValueY1, m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Top + m_rectWorking.Width / 2); } } ////// Enum MeterTextLocation /// public enum MeterTextLocation { ////// The none /// None, ////// The top /// Top, ////// The bottom /// Bottom }}
以上是"c#中Winform自定义控件如何实现仪表盘功能"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
文字
颜色
刻度
字体
控件
内圆
指针
边界
边界线
位置
仪表
仪表盘
功能
c#
最大
最小
代码
内容
分割线
数量
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
安徽省财经发展统计数据库
股票软件开发软件公司
虹口区市场软件开发要多少钱
聊天软件开发背景
服务器增加内存条需要挂载吗
新冠核酸数据上报国家数据库
网络安全专业清华大学
电子处方软件开发官方平平台
校外如何使用万德数据库
传奇能不能更改数据库
华为网络技术工程师产品线
美国 网络安全产业
老头环服务器断开连接是怎么回事
城市软件开发
自己的电脑云千年服务器
数据库重放
手机克隆传输数据会传服务器吗
服务器错误无法下载app
数据库设计两个方面的内容
湛江商城软件开发电话
网络安全专业清华大学
用友sql附加数据库
交大应用软件开发 c
金康新能源软件开发部
企业网络安全的目的和意义
科技互联网行业100强
ibm服务器断电了进不去系统
全省网络安全知识大赛密码
服务器上的防火墙
厦门网络安全技能竞赛