+ UIRuler: 增加刻度尺控件
This commit is contained in:
parent
bd8b9eb5d4
commit
91c59c9abb
373
SunnyUI/Controls/UIRuler.cs
Normal file
373
SunnyUI/Controls/UIRuler.cs
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置主题样式
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uiColor">主题样式</param>
|
||||||
|
public override void SetStyleColor(UIBaseStyle uiColor)
|
||||||
|
{
|
||||||
|
base.SetStyleColor(uiColor);
|
||||||
|
|
||||||
|
rectColor = uiColor.LineRectColor;
|
||||||
|
ForeColor = uiColor.LineForeColor;
|
||||||
|
fillColor = UIColor.Transparent;
|
||||||
|
BackColor = UIColor.Transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 线颜色
|
||||||
|
/// </summary>
|
||||||
|
[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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -84,7 +84,6 @@ namespace Sunny.UI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private int _maximum = 100;
|
private int _maximum = 100;
|
||||||
private int _minimum;
|
private int _minimum;
|
||||||
private int trackBarValue;
|
private int trackBarValue;
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
namespace Sunny.UI
|
|
||||||
{
|
|
||||||
public class UIRuler : UIControl
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user