diff --git a/SunnyUI/Controls/UIRuler.cs b/SunnyUI/Controls/UIRuler.cs new file mode 100644 index 00000000..53a32de8 --- /dev/null +++ b/SunnyUI/Controls/UIRuler.cs @@ -0,0 +1,373 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2023 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@QQ.Com + * + * Blog: https://www.cnblogs.com/yhuse + * Gitee: https://gitee.com/yhuse/SunnyUI + * GitHub: https://github.com/yhuse/SunnyUI + * + * SunnyUI.dll can be used for free under the GPL-3.0 license. + * If you use this code, please keep this note. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIRuler.cs + * 文件说明: 刻度尺 + * 当前版本: V3.6.1 + * 创建日期: 2020-01-01 + * + * 2023-11-29: V3.6.1 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [ToolboxItem(true)] + public class UIRuler : UIControl + { + private UITrackBar.BarDirection direction = UITrackBar.BarDirection.Horizontal; + + [DefaultValue(UITrackBar.BarDirection.Horizontal)] + [Description("线条方向"), Category("SunnyUI")] + public UITrackBar.BarDirection Direction + { + get => direction; + set + { + direction = value; + Invalidate(); + } + } + + public UIRuler() + { + SetStyleFlags(); + Width = 150; + Height = 29; + + ShowText = false; + ShowRect = false; + + fillColor = UIColor.Transparent; + BackColor = UIColor.Transparent; + } + + private int interval = 15; + + [DefaultValue(15)] + [Description("两边间隔"), Category("SunnyUI")] + public int Interval + { + get => interval; + set + { + interval = value; + Invalidate(); + } + } + + public enum UITextPos + { + Front, + Behind + } + + UITextPos textDirection = UITextPos.Front; + + [DefaultValue(UITextPos.Front)] + [Description("文字位置"), Category("SunnyUI")] + public UITextPos TextDirection + { + get => textDirection; + set + { + textDirection = value; + Invalidate(); + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + double value = StartValue; + + //水平显示 + if (Direction == UITrackBar.BarDirection.Horizontal) + { + float step = (Width - interval * 2) * 1.0f / stepCount; + float mstep = 0; + if (minorCount > 0) mstep = step * 1.0f / (minorCount + 1); + float left = interval; + + //文字在上面 + if (TextDirection == UITextPos.Front) + { + for (int i = 0; i <= stepCount; i++) + { + e.Graphics.DrawLine(LineColor, left, Height, left, Height - MajorSize); + if (i < stepCount) + { + for (int j = 0; j < minorCount; j++) + { + e.Graphics.DrawLine(LineColor, left + mstep * (j + 1), Height, left + mstep * (j + 1), Height - minorSize); + } + } + + string str = value.ToString("F" + decimalPlaces); + e.Graphics.DrawString(str, Font, ForeColor, new Rectangle((int)left - 100, Height - MajorSize - 200 - 1, 200, 200), ContentAlignment.BottomCenter, 1, 0); + left += step; + value += StepValue; + } + } + + if (TextDirection == UITextPos.Behind) + { + for (int i = 0; i <= stepCount; i++) + { + e.Graphics.DrawLine(LineColor, left, 0, left, MajorSize); + if (i < stepCount) + { + for (int j = 0; j < minorCount; j++) + { + e.Graphics.DrawLine(LineColor, left + mstep * (j + 1), 0, left + mstep * (j + 1), minorSize); + } + } + + string str = value.ToString("F" + decimalPlaces); + e.Graphics.DrawString(str, Font, ForeColor, new Rectangle((int)left - 100, MajorSize + 1, 200, 200), ContentAlignment.TopCenter, 1, 0); + left += step; + value += StepValue; + } + } + } + + //垂直显示,从下往上 + if (Direction == UITrackBar.BarDirection.Vertical) + { + float step = (Height - interval * 2) * 1.0f / stepCount; + float mstep = 0; + if (minorCount > 0) mstep = step * 1.0f / (minorCount + 1); + float top = Height - interval; + + //文字在左面 + if (TextDirection == UITextPos.Front) + { + for (int i = 0; i <= stepCount; i++) + { + e.Graphics.DrawLine(LineColor, Width, top, Width - MajorSize, top); + if (i < stepCount) + { + for (int j = 0; j < minorCount; j++) + { + e.Graphics.DrawLine(LineColor, Width, top - mstep * (j + 1), Width - minorSize, top - mstep * (j + 1)); + } + } + + string str = value.ToString("F" + decimalPlaces); + e.Graphics.DrawString(str, Font, ForeColor, new Rectangle(Width - MajorSize - 200 + 1, (int)top - 100, 200, 200), ContentAlignment.MiddleRight, 0, 0); + top -= step; + value += StepValue; + } + } + + //文字在右边 + if (TextDirection == UITextPos.Behind) + { + for (int i = 0; i <= stepCount; i++) + { + e.Graphics.DrawLine(LineColor, 0, top, MajorSize, top); + if (i < stepCount) + { + for (int j = 0; j < minorCount; j++) + { + e.Graphics.DrawLine(LineColor, 0, top - mstep * (j + 1), minorSize, top - mstep * (j + 1)); + } + } + + string str = value.ToString("F" + decimalPlaces); + e.Graphics.DrawString(str, Font, ForeColor, new Rectangle(MajorSize + 1, (int)top - 100, 200, 200), ContentAlignment.MiddleLeft, 0, 0); + top -= step; + value += StepValue; + } + } + } + + //垂直显示,从上往下 + if (Direction == UITrackBar.BarDirection.VerticalDown) + { + float step = (Height - interval * 2) * 1.0f / stepCount; + float mstep = 0; + if (minorCount > 0) mstep = step * 1.0f / (minorCount + 1); + float top = interval; + + //文字在左面 + if (TextDirection == UITextPos.Front) + { + for (int i = 0; i <= stepCount; i++) + { + e.Graphics.DrawLine(LineColor, Width, top, Width - MajorSize, top); + if (i < stepCount) + { + for (int j = 0; j < minorCount; j++) + { + e.Graphics.DrawLine(LineColor, Width, top + mstep * (j + 1), Width - minorSize, top + mstep * (j + 1)); + } + } + + string str = value.ToString("F" + decimalPlaces); + e.Graphics.DrawString(str, Font, ForeColor, new Rectangle(Width - MajorSize - 200 + 1, (int)top - 100, 200, 200), ContentAlignment.MiddleRight, 0, 0); + top += step; + value += StepValue; + } + } + + //文字在右边 + if (TextDirection == UITextPos.Behind) + { + for (int i = 0; i <= stepCount; i++) + { + e.Graphics.DrawLine(LineColor, 0, top, MajorSize, top); + if (i < stepCount) + { + for (int j = 0; j < minorCount; j++) + { + e.Graphics.DrawLine(LineColor, 0, top + mstep * (j + 1), minorSize, top + mstep * (j + 1)); + } + } + + string str = value.ToString("F" + decimalPlaces); + e.Graphics.DrawString(str, Font, ForeColor, new Rectangle(MajorSize + 1, (int)top - 100, 200, 200), ContentAlignment.MiddleLeft, 0, 0); + top += step; + value += StepValue; + } + } + } + } + + /// + /// 设置主题样式 + /// + /// 主题样式 + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + + rectColor = uiColor.LineRectColor; + ForeColor = uiColor.LineForeColor; + fillColor = UIColor.Transparent; + BackColor = UIColor.Transparent; + } + + /// + /// 线颜色 + /// + [Description("线颜色"), Category("SunnyUI")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color LineColor + { + get => rectColor; + set => SetRectColor(value); + } + + private double startValue = 0; + + [Description("起始值"), Category("SunnyUI")] + [DefaultValue(typeof(double), "0")] + public double StartValue + { + get => startValue; + set + { + startValue = value; + Invalidate(); + } + } + + private double stepValue = 20; + + [Description("递增值"), Category("SunnyUI")] + [DefaultValue(typeof(double), "20")] + public double StepValue + { + get => stepValue; + set + { + stepValue = Math.Max(1, value); + Invalidate(); + } + } + + private int stepCount = 5; + + [Description("递增次数"), Category("SunnyUI")] + [DefaultValue(5)] + public int StepCount + { + get => stepCount; + set + { + stepCount = Math.Max(1, value); + Invalidate(); + } + } + + private int majorSize = 6; + + [Description("主刻度长度"), Category("SunnyUI")] + [DefaultValue(6)] + public int MajorSize + { + get => majorSize; + set + { + majorSize = Math.Max(4, value); + Invalidate(); + } + } + + private int minorSize = 3; + + [Description("小刻度长度"), Category("SunnyUI")] + [DefaultValue(3)] + public int MinorSize + { + get => minorSize; + set + { + minorSize = Math.Max(2, value); + Invalidate(); + } + } + + private int minorCount = 1; + + [Description("小刻度个数"), Category("SunnyUI")] + [DefaultValue(1)] + public int MinorCount + { + get => minorCount; + set + { + minorCount = Math.Max(0, value); + Invalidate(); + } + } + + private int decimalPlaces = 0; + [Description("浮点数,显示文字小数位数"), Category("SunnyUI")] + [DefaultValue(0)] + public int DecimalPlaces + { + get => decimalPlaces; + set + { + decimalPlaces = Math.Max(0, value); + Invalidate(); + } + } + } +} diff --git a/SunnyUI/Controls/UITrackBar.cs b/SunnyUI/Controls/UITrackBar.cs index 133c05f6..7510e45e 100644 --- a/SunnyUI/Controls/UITrackBar.cs +++ b/SunnyUI/Controls/UITrackBar.cs @@ -84,7 +84,6 @@ namespace Sunny.UI } } - private int _maximum = 100; private int _minimum; private int trackBarValue; diff --git a/SunnyUI/UIRuler.cs b/SunnyUI/UIRuler.cs deleted file mode 100644 index 177b4a06..00000000 --- a/SunnyUI/UIRuler.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Sunny.UI -{ - public class UIRuler : UIControl - { - - } -}