diff --git a/Bin/net40/SunnyUI.Demo.exe b/Bin/net40/SunnyUI.Demo.exe index 9ec89781..5610c46b 100644 Binary files a/Bin/net40/SunnyUI.Demo.exe and b/Bin/net40/SunnyUI.Demo.exe differ diff --git a/Bin/net40/SunnyUI.dll b/Bin/net40/SunnyUI.dll index c66985ae..645aa584 100644 Binary files a/Bin/net40/SunnyUI.dll and b/Bin/net40/SunnyUI.dll differ diff --git a/Bin/net5.0-windows/SunnyUI.dll b/Bin/net5.0-windows/SunnyUI.dll index 2be3dfb5..9d21dc6f 100644 Binary files a/Bin/net5.0-windows/SunnyUI.dll and b/Bin/net5.0-windows/SunnyUI.dll differ diff --git a/Bin/net5.0-windows/ref/SunnyUI.dll b/Bin/net5.0-windows/ref/SunnyUI.dll index 89622a1f..ec711da3 100644 Binary files a/Bin/net5.0-windows/ref/SunnyUI.dll and b/Bin/net5.0-windows/ref/SunnyUI.dll differ diff --git a/Bin/netcoreapp3.1/SunnyUI.dll b/Bin/netcoreapp3.1/SunnyUI.dll index 296e4a99..76ef6ab0 100644 Binary files a/Bin/netcoreapp3.1/SunnyUI.dll and b/Bin/netcoreapp3.1/SunnyUI.dll differ diff --git a/SunnyUI.Demo/Controls/FLabel.Designer.cs b/SunnyUI.Demo/Controls/FLabel.Designer.cs index 444943e3..3a6f1532 100644 --- a/SunnyUI.Demo/Controls/FLabel.Designer.cs +++ b/SunnyUI.Demo/Controls/FLabel.Designer.cs @@ -57,6 +57,7 @@ this.PagePanel.Controls.Add(this.uiLine1); this.PagePanel.Controls.Add(this.uiLinkLabel1); this.PagePanel.Controls.Add(this.uiLabel1); + this.PagePanel.Size = new System.Drawing.Size(800, 415); // // uiLabel1 // @@ -154,6 +155,7 @@ this.uiMarkLabel1.Size = new System.Drawing.Size(118, 21); this.uiMarkLabel1.TabIndex = 24; this.uiMarkLabel1.Text = "uiMarkLabel1"; + this.uiMarkLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // uiLine4 // @@ -177,6 +179,7 @@ this.uiMarkLabel2.Size = new System.Drawing.Size(113, 26); this.uiMarkLabel2.TabIndex = 26; this.uiMarkLabel2.Text = "uiMarkLabel2"; + this.uiMarkLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // uiMarkLabel3 // @@ -189,6 +192,7 @@ this.uiMarkLabel3.Size = new System.Drawing.Size(118, 21); this.uiMarkLabel3.TabIndex = 27; this.uiMarkLabel3.Text = "uiMarkLabel3"; + this.uiMarkLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // uiMarkLabel4 // @@ -201,10 +205,10 @@ this.uiMarkLabel4.Size = new System.Drawing.Size(113, 26); this.uiMarkLabel4.TabIndex = 28; this.uiMarkLabel4.Text = "uiMarkLabel4"; + this.uiMarkLabel4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // FLabel // - this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.ClientSize = new System.Drawing.Size(800, 450); this.Name = "FLabel"; diff --git a/SunnyUI.Demo/Controls/FOther.Designer.cs b/SunnyUI.Demo/Controls/FOther.Designer.cs index 22f7f019..08701971 100644 --- a/SunnyUI.Demo/Controls/FOther.Designer.cs +++ b/SunnyUI.Demo/Controls/FOther.Designer.cs @@ -58,11 +58,15 @@ this.uiToolTip1 = new Sunny.UI.UIToolTip(this.components); this.uiProcessBar2 = new Sunny.UI.UIProcessBar(); this.uiRoundProcess1 = new Sunny.UI.UIRoundProcess(); + this.uiLine9 = new Sunny.UI.UILine(); + this.uiRoundProcess2 = new Sunny.UI.UIRoundProcess(); this.PagePanel.SuspendLayout(); this.SuspendLayout(); // // PagePanel // + this.PagePanel.Controls.Add(this.uiRoundProcess2); + this.PagePanel.Controls.Add(this.uiLine9); this.PagePanel.Controls.Add(this.uiRoundProcess1); this.PagePanel.Controls.Add(this.uiProcessBar2); this.PagePanel.Controls.Add(this.uiLabel3); @@ -90,7 +94,7 @@ this.PagePanel.Controls.Add(this.uiLight2); this.PagePanel.Controls.Add(this.uiLine2); this.PagePanel.Controls.Add(this.uiLight1); - this.PagePanel.Size = new System.Drawing.Size(800, 472); + this.PagePanel.Size = new System.Drawing.Size(800, 578); // // uiLight1 // @@ -166,7 +170,7 @@ // uiProgressIndicator1 // this.uiProgressIndicator1.Font = new System.Drawing.Font("微软雅黑", 12F); - this.uiProgressIndicator1.Location = new System.Drawing.Point(30, 298); + this.uiProgressIndicator1.Location = new System.Drawing.Point(381, 339); this.uiProgressIndicator1.MinimumSize = new System.Drawing.Size(1, 1); this.uiProgressIndicator1.Name = "uiProgressIndicator1"; this.uiProgressIndicator1.Size = new System.Drawing.Size(120, 120); @@ -176,7 +180,7 @@ // uiLine4 // this.uiLine4.Font = new System.Drawing.Font("微软雅黑", 12F); - this.uiLine4.Location = new System.Drawing.Point(30, 271); + this.uiLine4.Location = new System.Drawing.Point(381, 313); this.uiLine4.MinimumSize = new System.Drawing.Size(16, 16); this.uiLine4.Name = "uiLine4"; this.uiLine4.Size = new System.Drawing.Size(319, 20); @@ -194,6 +198,7 @@ this.uiTrackBar1.Size = new System.Drawing.Size(158, 29); this.uiTrackBar1.TabIndex = 30; this.uiTrackBar1.Text = "uiTrackBar1"; + this.uiTrackBar1.Value = 50; // // uiLine5 // @@ -333,7 +338,7 @@ // uiLine7 // this.uiLine7.Font = new System.Drawing.Font("微软雅黑", 12F); - this.uiLine7.Location = new System.Drawing.Point(381, 313); + this.uiLine7.Location = new System.Drawing.Point(29, 256); this.uiLine7.MinimumSize = new System.Drawing.Size(16, 16); this.uiLine7.Name = "uiLine7"; this.uiLine7.Size = new System.Drawing.Size(319, 20); @@ -345,7 +350,7 @@ // this.uiLabel1.AutoSize = true; this.uiLabel1.Font = new System.Drawing.Font("微软雅黑", 12F); - this.uiLabel1.Location = new System.Drawing.Point(382, 350); + this.uiLabel1.Location = new System.Drawing.Point(30, 293); this.uiLabel1.Name = "uiLabel1"; this.uiLabel1.Size = new System.Drawing.Size(138, 21); this.uiLabel1.TabIndex = 53; @@ -357,7 +362,7 @@ // this.uiLabel2.AutoSize = true; this.uiLabel2.Font = new System.Drawing.Font("微软雅黑", 12F); - this.uiLabel2.Location = new System.Drawing.Point(562, 350); + this.uiLabel2.Location = new System.Drawing.Point(210, 293); this.uiLabel2.Name = "uiLabel2"; this.uiLabel2.Size = new System.Drawing.Size(138, 21); this.uiLabel2.TabIndex = 54; @@ -368,7 +373,7 @@ // this.uiLabel3.AutoSize = true; this.uiLabel3.Font = new System.Drawing.Font("微软雅黑", 12F); - this.uiLabel3.Location = new System.Drawing.Point(382, 388); + this.uiLabel3.Location = new System.Drawing.Point(30, 331); this.uiLabel3.Name = "uiLabel3"; this.uiLabel3.Size = new System.Drawing.Size(138, 21); this.uiLabel3.TabIndex = 55; @@ -397,22 +402,45 @@ // this.uiRoundProcess1.BackColor = System.Drawing.Color.Transparent; this.uiRoundProcess1.Font = new System.Drawing.Font("微软雅黑", 12F); - this.uiRoundProcess1.Inner = 30; - this.uiRoundProcess1.Location = new System.Drawing.Point(228, 298); + this.uiRoundProcess1.Location = new System.Drawing.Point(29, 393); this.uiRoundProcess1.MinimumSize = new System.Drawing.Size(1, 1); this.uiRoundProcess1.Name = "uiRoundProcess1"; - this.uiRoundProcess1.Outer = 50; - this.uiRoundProcess1.ProcessBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(155)))), ((int)(((byte)(200)))), ((int)(((byte)(255))))); - this.uiRoundProcess1.ProcessColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.uiRoundProcess1.ShowProcess = true; this.uiRoundProcess1.Size = new System.Drawing.Size(120, 120); this.uiRoundProcess1.TabIndex = 57; - this.uiRoundProcess1.Text = "uiRoundProcess1"; - this.uiRoundProcess1.Value = 80; + this.uiRoundProcess1.Text = "0.0%"; + // + // uiLine9 + // + this.uiLine9.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine9.Location = new System.Drawing.Point(30, 367); + this.uiLine9.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine9.Name = "uiLine9"; + this.uiLine9.Size = new System.Drawing.Size(319, 20); + this.uiLine9.TabIndex = 58; + this.uiLine9.Text = "UIRoundProcess"; + this.uiLine9.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiRoundProcess2 + // + this.uiRoundProcess2.BackColor = System.Drawing.Color.Transparent; + this.uiRoundProcess2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRoundProcess2.ForeColor = System.Drawing.Color.White; + this.uiRoundProcess2.Inner = 0; + this.uiRoundProcess2.Location = new System.Drawing.Point(156, 393); + this.uiRoundProcess2.MinimumSize = new System.Drawing.Size(1, 1); + this.uiRoundProcess2.Name = "uiRoundProcess2"; + this.uiRoundProcess2.ShowProcess = true; + this.uiRoundProcess2.Size = new System.Drawing.Size(120, 120); + this.uiRoundProcess2.Style = Sunny.UI.UIStyle.Custom; + this.uiRoundProcess2.StyleCustomMode = true; + this.uiRoundProcess2.TabIndex = 59; + this.uiRoundProcess2.Text = "0.0%"; // // FOther // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.ClientSize = new System.Drawing.Size(800, 507); + this.ClientSize = new System.Drawing.Size(800, 613); this.Name = "FOther"; this.Symbol = 62173; this.Text = "Other"; @@ -452,5 +480,7 @@ private UIToolTip uiToolTip1; private UIProcessBar uiProcessBar2; private UIRoundProcess uiRoundProcess1; + private UIRoundProcess uiRoundProcess2; + private UILine uiLine9; } } \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FOther.cs b/SunnyUI.Demo/Controls/FOther.cs index e2ec1b8a..8b993670 100644 --- a/SunnyUI.Demo/Controls/FOther.cs +++ b/SunnyUI.Demo/Controls/FOther.cs @@ -24,6 +24,7 @@ value++; uiTrackBar1.Value = value; uiProcessBar2.Value = uiProcessBar1.Value = value; + uiRoundProcess2.Value = uiRoundProcess1.Value = value; } } } \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FOther.resx b/SunnyUI.Demo/Controls/FOther.resx index 031fc2d8..30293e22 100644 --- a/SunnyUI.Demo/Controls/FOther.resx +++ b/SunnyUI.Demo/Controls/FOther.resx @@ -123,9 +123,6 @@ 17, 17 - - 107, 17 - 35 diff --git a/SunnyUI/Controls/UIRoundProcess.cs b/SunnyUI/Controls/UIRoundProcess.cs index c134bf4f..d746f08d 100644 --- a/SunnyUI/Controls/UIRoundProcess.cs +++ b/SunnyUI/Controls/UIRoundProcess.cs @@ -19,16 +19,19 @@ * 2021-04-08: V3.0.2 增加文件说明 ******************************************************************************/ +using System; using System.ComponentModel; using System.Drawing; -using System.Windows.Forms; +using System.Drawing.Drawing2D; namespace Sunny.UI { /// /// 圆形滚动条 /// - [ToolboxItem(false)] + [ToolboxItem(true)] + [DefaultEvent("ValueChanged")] + [DefaultProperty("Value")] public class UIRoundProcess : UIControl { public UIRoundProcess() @@ -37,29 +40,136 @@ namespace Sunny.UI Inner = 30; Outer = 50; - ProcessColor = UIColor.Blue; - ProcessBackColor = Color.FromArgb(155, 200, 255); - base.BackColor = Color.Transparent; + fillColor = UIColor.Blue; + rectColor = Color.FromArgb(155, 200, 255); + foreColor = UIColor.Blue; ShowText = false; ShowRect = false; - ShowFill = false; } - public int Inner { get; set; } + private int maximum = 100; - public int Outer { get; set; } - - public Color ProcessColor { get; set; } - - public Color ProcessBackColor { get; set; } - - public int Value { get; set; } - - protected override void OnPaint(PaintEventArgs e) + [DefaultValue(100)] + [Description("最大值"), Category("SunnyUI")] + public int Maximum { - base.OnPaint(e); - e.Graphics.FillFan(ProcessBackColor, ClientRectangle.Center(), Inner, Outer, 0, 360); - e.Graphics.FillFan(ProcessColor, ClientRectangle.Center(), Inner, Outer, -90, Value / 100.0f * 360); + get => maximum; + set + { + maximum = Math.Max(1, value); + Invalidate(); + } + } + + private int inner = 30; + private int outer = 50; + + [Description("内径")] + [Category("SunnyUI")] + [DefaultValue(30)] + public int Inner + { + get => inner; + set + { + inner = Math.Max(value, 0); + inner = Math.Min(value, outer - 5); + Invalidate(); + } + } + + [Description("外径")] + [Category("SunnyUI")] + [DefaultValue(50)] + public int Outer + { + get => outer; + set + { + outer = Math.Max(value, 5); + inner = Math.Min(inner, outer - 5); + Invalidate(); + } + } + + /// + /// 进度条前景色 + /// + [Description("进度条前景色")] + [Category("SunnyUI")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color ProcessColor + { + get => fillColor; + set => SetFillColor(value); + } + + /// + /// 进度条背景色 + /// + [Description("进度条背景色")] + [Category("SunnyUI")] + [DefaultValue(typeof(Color), "155, 200, 255")] + public Color ProcessBackColor + { + get => rectColor; + set => SetRectColor(value); + } + + /// + /// 字体颜色 + /// + [Description("字体颜色")] + [Category("SunnyUI")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + + private int posValue; + + [DefaultValue(0)] + [Description("当前位置"), Category("SunnyUI")] + public int Value + { + get => posValue; + set + { + posValue = Math.Max(value, 0); + posValue = Math.Min(posValue, maximum); + Text = (posValue * 100.0 / maximum).ToString("F1") + "%"; + ValueChanged?.Invoke(this, posValue); + Invalidate(); + } + } + + public delegate void OnValueChanged(object sender, int value); + + public event OnValueChanged ValueChanged; + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + g.FillFan(ProcessBackColor, ClientRectangle.Center(), Inner, Outer, 0, 360); + g.FillFan(ProcessColor, ClientRectangle.Center(), Inner, Outer, -90, Value * 1.0f / Maximum * 360.0f); + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + fillColor = uiColor.PrimaryColor; + foreColor = uiColor.PrimaryColor; + rectColor = uiColor.GridSelectedColor; + Invalidate(); + } + + public bool ShowProcess + { + get => ShowText; + set => ShowText = value; } } } diff --git a/SunnyUI/Static/UGDI.cs b/SunnyUI/Static/UGDI.cs index 385ac829..e389616d 100644 --- a/SunnyUI/Static/UGDI.cs +++ b/SunnyUI/Static/UGDI.cs @@ -728,30 +728,58 @@ namespace Sunny.UI public static void DrawFan(this Graphics g, Color color, Point center, float d1, float d2, float startAngle, float sweepAngle, bool smooth = true) { - GraphicsPath path = g.CreateFanPath(center, d1, d2, startAngle, sweepAngle); - g.DrawPath(color, path, smooth); - path.Dispose(); + if (d1.Equals(0)) + { + g.DrawPie(color, center.X - d2, center.Y - d2, d2 * 2, d2 * 2, startAngle, sweepAngle); + } + else + { + GraphicsPath path = g.CreateFanPath(center, d1, d2, startAngle, sweepAngle); + g.DrawPath(color, path, smooth); + path.Dispose(); + } } public static void DrawFan(this Graphics g, Color color, PointF center, float d1, float d2, float startAngle, float sweepAngle, bool smooth = true) { - GraphicsPath path = g.CreateFanPath(center, d1, d2, startAngle, sweepAngle); - g.DrawPath(color, path, smooth); - path.Dispose(); + if (d1.Equals(0)) + { + g.DrawPie(color, center.X - d2, center.Y - d2, d2 * 2, d2 * 2, startAngle, sweepAngle); + } + else + { + GraphicsPath path = g.CreateFanPath(center, d1, d2, startAngle, sweepAngle); + g.DrawPath(color, path, smooth); + path.Dispose(); + } } public static void FillFan(this Graphics g, Color color, Point center, float d1, float d2, float startAngle, float sweepAngle, bool smooth = true) { - GraphicsPath path = g.CreateFanPath(center, d1, d2, startAngle, sweepAngle); - g.FillPath(color, path, smooth); - path.Dispose(); + if (d1.Equals(0)) + { + g.FillPie(color, center.X - d2, center.Y - d2, d2 * 2, d2 * 2, startAngle, sweepAngle); + } + else + { + GraphicsPath path = g.CreateFanPath(center, d1, d2, startAngle, sweepAngle); + g.FillPath(color, path, smooth); + path.Dispose(); + } } public static void FillFan(this Graphics g, Color color, PointF center, float d1, float d2, float startAngle, float sweepAngle, bool smooth = true) { - GraphicsPath path = g.CreateFanPath(center, d1, d2, startAngle, sweepAngle); - g.FillPath(color, path, smooth); - path.Dispose(); + if (d1.Equals(0)) + { + g.FillPie(color, center.X - d2, center.Y - d2, d2 * 2, d2 * 2, startAngle, sweepAngle); + } + else + { + GraphicsPath path = g.CreateFanPath(center, d1, d2, startAngle, sweepAngle); + g.FillPath(color, path, smooth); + path.Dispose(); + } } public static void FillPie(this Graphics g, Color color, int x, int y, int width, int height, float startAngle, float sweepAngle, bool smooth = true)