diff --git a/SunnyUI/Charts/UILineChartOption.cs b/SunnyUI/Charts/UILineChartOption.cs index d77ba514..22d21c42 100644 --- a/SunnyUI/Charts/UILineChartOption.cs +++ b/SunnyUI/Charts/UILineChartOption.cs @@ -20,6 +20,7 @@ * 2022-07-15: V3.2.1 增加移除线的操作 * 2022-11-25: V3.2.2 增加了线的最大点数设置,以及移除点数的设置 * 2022-11-25: V3.2.2 重构对象 + * 2023-05-06: V3.3.6 增加了UpdateYData函数,按序号更新Y轴值 ******************************************************************************/ using System; @@ -168,6 +169,12 @@ namespace Sunny.UI } } + public void UpdateYData(string seriesName, int index, double value) + { + if (!Series.ContainsKey(seriesName)) return; + Series[seriesName].UpdateYData(index, value); + } + public void Clear() { foreach (var series in Series.Values) @@ -476,6 +483,15 @@ namespace Sunny.UI private int MaxCount = 0; + public void UpdateYData(int index, double value) + { + if (YData.Count == 0) return; + if (index >= 0 && index < YData.Count) + { + YData[index] = value; + } + } + /// /// 设置线的最大点数,0不限制 /// diff --git a/SunnyUI/Common/UGDI.cs b/SunnyUI/Common/UGDI.cs index 43d3da5e..a65073a2 100644 --- a/SunnyUI/Common/UGDI.cs +++ b/SunnyUI/Common/UGDI.cs @@ -592,7 +592,7 @@ namespace Sunny.UI /// 水平方向 /// 垂直方向 /// 文本布局 - public static StringFormat SetAlignment(StringAlignment horizontalAlignment = StringAlignment.Center, StringAlignment verticalAlignment = StringAlignment.Center) + public static StringFormat SetCenterAlignment(StringAlignment horizontalAlignment = StringAlignment.Center, StringAlignment verticalAlignment = StringAlignment.Center) { return new StringFormat { Alignment = horizontalAlignment, LineAlignment = verticalAlignment }; } diff --git a/SunnyUI/Common/UGraphics.cs b/SunnyUI/Common/UGraphics.cs index c0ab0c2d..5983d044 100644 --- a/SunnyUI/Common/UGraphics.cs +++ b/SunnyUI/Common/UGraphics.cs @@ -173,6 +173,182 @@ namespace Sunny.UI public static void DrawString(this Graphics g, string text, Font font, Color color, Point pt, StringFormat format) => g.DrawString(text, font, color, pt.X, pt.Y, format); + /// + /// 绘制字符串 + /// + /// 绘图图元 + /// 字符串 + /// 字体 + /// 颜色 + /// 大小 + /// 边距 + /// 位置位置 + public static void DrawString(this Graphics g, string str, Font font, Color color, Size size, Padding padding, ContentAlignment align, int offsetX = 0, int offsetY = 0) + { + if (str.IsNullOrEmpty()) return; + SizeF sf = g.MeasureString(str, font); + using Brush br = color.Brush(); + switch (align) + { + case ContentAlignment.MiddleCenter: + g.DrawString(str, font, br, padding.Left + (size.Width - sf.Width - padding.Left - padding.Right) / 2.0f + offsetX, + padding.Top + (size.Height - sf.Height - padding.Top - padding.Bottom) / 2.0f + offsetY); + break; + + case ContentAlignment.TopLeft: + g.DrawString(str, font, br, padding.Left + offsetX, padding.Top + offsetY); + break; + + case ContentAlignment.TopCenter: + g.DrawString(str, font, br, padding.Left + (size.Width - sf.Width - padding.Left - padding.Right) / 2.0f + offsetX, padding.Top + offsetY); + break; + + case ContentAlignment.TopRight: + g.DrawString(str, font, br, size.Width - sf.Width - padding.Right + offsetX, padding.Top + offsetY); + break; + + case ContentAlignment.MiddleLeft: + g.DrawString(str, font, br, padding.Left + offsetX, padding.Top + (size.Height - sf.Height - padding.Top - padding.Bottom) / 2.0f + offsetY); + break; + + case ContentAlignment.MiddleRight: + g.DrawString(str, font, br, size.Width - sf.Width - padding.Right + offsetX, padding.Top + (size.Height - sf.Height - padding.Top - padding.Bottom) / 2.0f + offsetY); + break; + + case ContentAlignment.BottomLeft: + g.DrawString(str, font, br, padding.Left + offsetX, size.Height - sf.Height - padding.Bottom + offsetY); + break; + + case ContentAlignment.BottomCenter: + g.DrawString(str, font, br, padding.Left + (size.Width - sf.Width - padding.Left - padding.Right) / 2.0f + offsetX, size.Height - sf.Height - padding.Bottom + offsetY); + break; + + case ContentAlignment.BottomRight: + g.DrawString(str, font, br, size.Width - sf.Width - padding.Right + offsetX, size.Height - sf.Height - padding.Bottom + offsetY); + break; + } + } + + /// + /// 绘制字符串 + /// + /// 绘图图元 + /// 文字 + /// 字体 + /// 颜色 + /// 区域 + /// 格式 + /// 角度 + public static void DrawString(this Graphics g, string text, Font font, Color color, RectangleF rect, StringFormat format, float angle) + { + if (text.IsNullOrEmpty()) return; + using Brush br = color.Brush(); + g.DrawStringRotateAtCenter(text, font, color, rect.Center(), (int)angle); + } + + /// + /// 以文字中心点为原点,旋转文字 + /// + /// 绘图图元 + /// 文字 + /// 字体 + /// 颜色 + /// 文字中心点 + /// 角度 + public static void DrawStringRotateAtCenter(this Graphics g, string text, Font font, Color color, PointF centerPoint, float angle) + { + if (text.IsNullOrEmpty()) return; + using Brush br = color.Brush(); + g.DrawStringRotateAtCenter(text, font, br, centerPoint, angle); + } + + /// + /// 以文字中心点为原点,旋转文字 + /// + /// 绘图图元 + /// 文字 + /// 字体 + /// 笔刷 + /// 文字中心点 + /// 角度 + public static void DrawStringRotateAtCenter(this Graphics g, string text, Font font, Brush brush, PointF centerPoint, float angle) + { + if (text.IsNullOrEmpty()) return; + SizeF sf = g.MeasureString(text, font); + float x1 = centerPoint.X - sf.Width / 2.0f; + float y1 = centerPoint.Y - sf.Height / 2.0f; + + // 把画板的原点(默认是左上角)定位移到文字中心 + g.TranslateTransform(x1 + sf.Width / 2, y1 + sf.Height / 2); + // 旋转画板 + g.RotateTransform(angle); + // 回退画板x,y轴移动过的距离 + g.TranslateTransform(-(x1 + sf.Width / 2), -(y1 + sf.Height / 2)); + g.DrawString(text, font, brush, x1, y1); + + //恢复 + g.TranslateTransform(x1 + sf.Width / 2, y1 + sf.Height / 2); + g.RotateTransform(-angle); + g.TranslateTransform(-(x1 + sf.Width / 2), -(y1 + sf.Height / 2)); + } + + /// + /// 以旋转点为原点,旋转文字 + /// + /// 绘图图元 + /// 文本 + /// 字体 + /// 填充 + /// 旋转点 + /// 布局方式 + /// 角度 + public static void DrawString(this Graphics g, string text, Font font, Brush brush, PointF rotatePoint, StringFormat format, float angle) + { + if (text.IsNullOrEmpty()) return; + // Save the matrix + Matrix mtxSave = g.Transform; + Matrix mtxRotate = g.Transform; + mtxRotate.RotateAt(angle, rotatePoint); + g.Transform = mtxRotate; + g.DrawString(text, font, brush, rotatePoint, format); + + // Reset the matrix + g.Transform = mtxSave; + } + + /// + /// 绘制字符串 + /// + /// 绘图图元 + /// 文字 + /// 字体 + /// 颜色 + /// 旋转点 + /// 格式 + /// 角度 + public static void DrawString(this Graphics g, string text, Font font, Color color, PointF rotatePoint, StringFormat format, float angle) + { + if (text.IsNullOrEmpty()) return; + using Brush br = color.Brush(); + g.DrawString(text, font, br, rotatePoint, format, angle); + } + + /// + /// 绘制根据矩形旋转文本 + /// + /// 绘图图元 + /// 文本 + /// 字体 + /// 填充 + /// 局部矩形 + /// 布局方式 + /// 角度 + public static void DrawString(this Graphics g, string text, Font font, Brush brush, RectangleF rect, StringFormat format, float angle) + { + if (text.IsNullOrEmpty()) return; + g.DrawStringRotateAtCenter(text, font, brush, rect.Center(), angle); + } + /// /// 绘制多条直线连接 /// @@ -1463,182 +1639,6 @@ namespace Sunny.UI new Rectangle(cutLeft, cutTop, img.Width - cutLeft - cutRight, img.Height - cutTop - cutBottom), GraphicsUnit.Pixel); } - /// - /// 绘制字符串 - /// - /// 绘图图元 - /// 字符串 - /// 字体 - /// 颜色 - /// 大小 - /// 边距 - /// 位置位置 - public static void DrawString(this Graphics g, string str, Font font, Color color, Size size, Padding padding, ContentAlignment align, int offsetX = 0, int offsetY = 0) - { - if (str.IsNullOrEmpty()) return; - SizeF sf = g.MeasureString(str, font); - using Brush br = color.Brush(); - switch (align) - { - case ContentAlignment.MiddleCenter: - g.DrawString(str, font, br, padding.Left + (size.Width - sf.Width - padding.Left - padding.Right) / 2.0f + offsetX, - padding.Top + (size.Height - sf.Height - padding.Top - padding.Bottom) / 2.0f + offsetY); - break; - - case ContentAlignment.TopLeft: - g.DrawString(str, font, br, padding.Left + offsetX, padding.Top + offsetY); - break; - - case ContentAlignment.TopCenter: - g.DrawString(str, font, br, padding.Left + (size.Width - sf.Width - padding.Left - padding.Right) / 2.0f + offsetX, padding.Top + offsetY); - break; - - case ContentAlignment.TopRight: - g.DrawString(str, font, br, size.Width - sf.Width - padding.Right + offsetX, padding.Top + offsetY); - break; - - case ContentAlignment.MiddleLeft: - g.DrawString(str, font, br, padding.Left + offsetX, padding.Top + (size.Height - sf.Height - padding.Top - padding.Bottom) / 2.0f + offsetY); - break; - - case ContentAlignment.MiddleRight: - g.DrawString(str, font, br, size.Width - sf.Width - padding.Right + offsetX, padding.Top + (size.Height - sf.Height - padding.Top - padding.Bottom) / 2.0f + offsetY); - break; - - case ContentAlignment.BottomLeft: - g.DrawString(str, font, br, padding.Left + offsetX, size.Height - sf.Height - padding.Bottom + offsetY); - break; - - case ContentAlignment.BottomCenter: - g.DrawString(str, font, br, padding.Left + (size.Width - sf.Width - padding.Left - padding.Right) / 2.0f + offsetX, size.Height - sf.Height - padding.Bottom + offsetY); - break; - - case ContentAlignment.BottomRight: - g.DrawString(str, font, br, size.Width - sf.Width - padding.Right + offsetX, size.Height - sf.Height - padding.Bottom + offsetY); - break; - } - } - - /// - /// 绘制字符串 - /// - /// 绘图图元 - /// 文字 - /// 字体 - /// 颜色 - /// 区域 - /// 格式 - /// 角度 - public static void DrawString(this Graphics g, string text, Font font, Color color, RectangleF rect, StringFormat format, float angle) - { - if (text.IsNullOrEmpty()) return; - using Brush br = color.Brush(); - g.DrawStringRotateAtCenter(text, font, color, rect.Center(), (int)angle); - } - - /// - /// 以文字中心点为原点,旋转文字 - /// - /// 绘图图元 - /// 文字 - /// 字体 - /// 颜色 - /// 文字中心点 - /// 角度 - public static void DrawStringRotateAtCenter(this Graphics g, string text, Font font, Color color, PointF centerPoint, float angle) - { - if (text.IsNullOrEmpty()) return; - using Brush br = color.Brush(); - g.DrawStringRotateAtCenter(text, font, br, centerPoint, angle); - } - - /// - /// 以文字中心点为原点,旋转文字 - /// - /// 绘图图元 - /// 文字 - /// 字体 - /// 笔刷 - /// 文字中心点 - /// 角度 - public static void DrawStringRotateAtCenter(this Graphics g, string text, Font font, Brush brush, PointF centerPoint, float angle) - { - if (text.IsNullOrEmpty()) return; - SizeF sf = g.MeasureString(text, font); - float x1 = centerPoint.X - sf.Width / 2.0f; - float y1 = centerPoint.Y - sf.Height / 2.0f; - - // 把画板的原点(默认是左上角)定位移到文字中心 - g.TranslateTransform(x1 + sf.Width / 2, y1 + sf.Height / 2); - // 旋转画板 - g.RotateTransform(angle); - // 回退画板x,y轴移动过的距离 - g.TranslateTransform(-(x1 + sf.Width / 2), -(y1 + sf.Height / 2)); - g.DrawString(text, font, brush, x1, y1); - - //恢复 - g.TranslateTransform(x1 + sf.Width / 2, y1 + sf.Height / 2); - g.RotateTransform(-angle); - g.TranslateTransform(-(x1 + sf.Width / 2), -(y1 + sf.Height / 2)); - } - - /// - /// 以旋转点为原点,旋转文字 - /// - /// 绘图图元 - /// 文本 - /// 字体 - /// 填充 - /// 旋转点 - /// 布局方式 - /// 角度 - public static void DrawString(this Graphics g, string text, Font font, Brush brush, PointF rotatePoint, StringFormat format, float angle) - { - if (text.IsNullOrEmpty()) return; - // Save the matrix - Matrix mtxSave = g.Transform; - Matrix mtxRotate = g.Transform; - mtxRotate.RotateAt(angle, rotatePoint); - g.Transform = mtxRotate; - g.DrawString(text, font, brush, rotatePoint, format); - - // Reset the matrix - g.Transform = mtxSave; - } - - /// - /// 绘制字符串 - /// - /// 绘图图元 - /// 文字 - /// 字体 - /// 颜色 - /// 旋转点 - /// 格式 - /// 角度 - public static void DrawString(this Graphics g, string text, Font font, Color color, PointF rotatePoint, StringFormat format, float angle) - { - if (text.IsNullOrEmpty()) return; - using Brush br = color.Brush(); - g.DrawString(text, font, br, rotatePoint, format, angle); - } - - /// - /// 绘制根据矩形旋转文本 - /// - /// 绘图图元 - /// 文本 - /// 字体 - /// 填充 - /// 局部矩形 - /// 布局方式 - /// 角度 - public static void DrawString(this Graphics g, string text, Font font, Brush brush, RectangleF rect, StringFormat format, float angle) - { - if (text.IsNullOrEmpty()) return; - g.DrawStringRotateAtCenter(text, font, brush, rect.Center(), angle); - } - /// /// 绘制两点连线 /// diff --git a/SunnyUI/Controls/UINavMenu.cs b/SunnyUI/Controls/UINavMenu.cs index 8ded24ae..dd245665 100644 --- a/SunnyUI/Controls/UINavMenu.cs +++ b/SunnyUI/Controls/UINavMenu.cs @@ -767,7 +767,7 @@ namespace Sunny.UI if (MenuHelper[e.Node] != null) { - using StringFormat alignment = GDI.SetAlignment(); + using StringFormat alignment = GDI.SetCenterAlignment(); if (MenuHelper[e.Node].TipsCustom) { e.Graphics.FillEllipse(MenuHelper[e.Node].TipsBackColor, tipsLeft, tipsTop, sfMax, sfMax);