c#中Winform自定义控件如何实现仪表盘功能
发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这篇文章主要介绍c#中Winform自定义控件如何实现仪表盘功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!准备工作依然使用GDI+画的,不懂的话就百度一下吧另外主要用到了三
千家信息网最后更新 2024年11月22日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安全错误
数据库的锁怎样保障安全
软件开发编程写程序好学吗
戴尔软件开发研究所
网络安全入侵检测简答题
sc数据库删除总数据
jsp表单与数据库连接
数据库表复制方法
北京千锋互联网科技公司
武汉软件开发的价格
爬应用的数据库
健康卡亲情号数据库连接失败
学软件开发转物联网
打印看不见数据库
泰隆银行网络安全宣传
饥荒服务器需要什么系统
电脑启动ftp服务器
ddos测压服务器违法吗
模拟城市我是市长服务器分几区吗
服务器tnsping 无监听
采用面向对象进行软件开发
二手机架服务器
新疆软件开发公司电话
我国网络安全应急体系
国家网络安全基地规划
sc数据库删除总数据
数据库技术应用题
软件开发要学的内容思维导图
上海专业网络技术商家
数据库安全性及完整性
网络安全对社区的建设
数据库回车后前面是分号怎么办