diff --git a/SunnyUI/Common/UGDI.cs b/SunnyUI/Common/UGDI.cs index a93fc00a..ba8d8dee 100644 --- a/SunnyUI/Common/UGDI.cs +++ b/SunnyUI/Common/UGDI.cs @@ -300,6 +300,83 @@ namespace Sunny.UI return path; } + /// + /// 创建圆角路径 + /// + /// 区域 + /// 圆角大小 + /// 圆角的方位 + /// 线宽 + /// + internal static GraphicsPath CreateRoundedRectanglePathWithoutTop(this Rectangle rect, int radius, UICornerRadiusSides radiusSides, int lineSize = 1) + { + GraphicsPath path; + + if (radiusSides == UICornerRadiusSides.None || radius == 0) + { + path = new GraphicsPath(); + path.AddLine(new Point(rect.X, rect.Y), new Point(rect.X, rect.Y + rect.Height)); + path.AddLine(new Point(rect.X, rect.Y + rect.Height), new Point(rect.X + rect.Width, rect.Y + rect.Height)); + path.AddLine(new Point(rect.X + rect.Width, rect.Y + rect.Height), new Point(rect.X + rect.Width, rect.Y)); + } + else + { + //IsRadius为True时,显示左上圆角 + bool RadiusLeftTop = radiusSides.GetValue(UICornerRadiusSides.LeftTop); + //IsRadius为True时,显示左下圆角 + bool RadiusLeftBottom = radiusSides.GetValue(UICornerRadiusSides.LeftBottom); + //IsRadius为True时,显示右上圆角 + bool RadiusRightTop = radiusSides.GetValue(UICornerRadiusSides.RightTop); + //IsRadius为True时,显示右下圆角 + bool RadiusRightBottom = radiusSides.GetValue(UICornerRadiusSides.RightBottom); + path = rect.CreateRoundedRectanglePathWithoutTop(radius, RadiusLeftTop, RadiusRightTop, RadiusRightBottom, RadiusLeftBottom, lineSize); + } + + return path; + } + + internal static GraphicsPath CreateRoundedRectanglePathWithoutTop(this Rectangle rect, int radius, + bool cornerLeftTop = true, bool cornerRightTop = true, bool cornerRightBottom = true, bool cornerLeftBottom = true, + int lineSize = 1) + { + GraphicsPath path = new GraphicsPath(); + + if ((!cornerLeftTop && !cornerRightTop && !cornerRightBottom && !cornerLeftBottom) || radius <= 0) + { + path.AddLine(new Point(rect.X, rect.Y), new Point(rect.X, rect.Y + rect.Height)); + path.AddLine(new Point(rect.X, rect.Y + rect.Height), new Point(rect.X + rect.Width, rect.Y + rect.Height)); + path.AddLine(new Point(rect.X + rect.Width, rect.Y + rect.Height), new Point(rect.X + rect.Width, rect.Y)); + } + else + { + radius *= lineSize; + + if (cornerRightTop) + path.AddArc(rect.X + rect.Width - radius, rect.Y, radius, radius, 270, 90); + else + path.AddLine(new Point(rect.X + rect.Width - 1, rect.Y), new Point(rect.X + rect.Width, rect.Y)); + + if (cornerRightBottom) + path.AddArc(rect.X + rect.Width - radius, rect.Y + rect.Height - radius, radius, radius, 0, 90); + else + path.AddLine(new Point(rect.X + rect.Width, rect.Y + rect.Height), new Point(rect.X + rect.Width, rect.Y + rect.Height)); + + if (cornerLeftBottom) + path.AddArc(rect.X, rect.Bottom - radius, radius, radius, 90, 90); + else + path.AddLine(new Point(rect.X + 1, rect.Y + rect.Height), new Point(rect.X, rect.Y + rect.Height)); + + if (cornerLeftTop) + path.AddArc(rect.X, rect.Y, radius, radius, 180, 90); + else + path.AddLine(new Point(rect.X, rect.Y + 1), new Point(rect.X, rect.Y)); + + //path.CloseFigure(); + } + + return path; + } + /// /// 绘图路径 /// diff --git a/SunnyUI/Controls/UIDataGridView.cs b/SunnyUI/Controls/UIDataGridView.cs index 30021837..df1dccc8 100644 --- a/SunnyUI/Controls/UIDataGridView.cs +++ b/SunnyUI/Controls/UIDataGridView.cs @@ -368,7 +368,29 @@ namespace Sunny.UI int idx = VBar.Value; if (idx < 0) idx = 0; if (idx >= RowCount) idx = RowCount - 1; - FirstDisplayedScrollingRowIndex = idx; + + int lastFrozen = 0; + if (Rows[0].Frozen) + { + for (int i = 0; i < Rows.Count; i++) + { + if (Rows[i].Frozen) + { + lastFrozen = i; + } + else + { + break; + } + } + } + + if (Rows[0].Frozen) + { + + } + + FirstDisplayedScrollingRowIndex = Math.Max(idx, lastFrozen); } private void HorizontalScrollBar_ValueChanged(object sender, EventArgs e) diff --git a/SunnyUI/Controls/UIGroupBox.cs b/SunnyUI/Controls/UIGroupBox.cs index 19512226..c553344c 100644 --- a/SunnyUI/Controls/UIGroupBox.cs +++ b/SunnyUI/Controls/UIGroupBox.cs @@ -20,6 +20,7 @@ * 2020-04-25: V2.2.4 更新主题配置类 * 2022-05-30: V3.1.9 修复Padding设置 * 2023-05-13: V3.3.6 重构DrawString函数 + * 2023-07-11: V3.4.0 解决BackColor,FillColor设置为透明时,标题下面会出现横线 ******************************************************************************/ using System; @@ -56,8 +57,22 @@ namespace Sunny.UI /// 绘图路径 protected override void OnPaintRect(Graphics g, GraphicsPath path) { - path = new Rectangle(0, TitleTop, Width - 1, Height - _titleTop - 1).CreateRoundedRectanglePath(Radius, RadiusSides); - base.OnPaintRect(g, path); + if (RectSides == ToolStripStatusLabelBorderSides.None) + { + return; + } + + var rect = new Rectangle(0, TitleTop, Width - 1, Height - _titleTop - 1); + if (Text.IsValid()) + { + path = rect.CreateRoundedRectanglePathWithoutTop(Radius, RadiusSides, RectSize); + g.DrawPath(GetRectColor(), path, true, RectSize); + } + else + { + path = rect.CreateRoundedRectanglePath(Radius, RadiusSides, RectSize); + g.DrawPath(GetRectColor(), path, true, RectSize); + } } /// @@ -67,7 +82,29 @@ namespace Sunny.UI /// 绘图路径 protected override void OnPaintFore(Graphics g, GraphicsPath path) { + Size size = TextRenderer.MeasureText(Text, Font); g.DrawString(Text, Font, ForeColor, FillColor, new Rectangle(TitleInterval, 0, Width - TitleInterval * 2, TitleTop * 2), TitleAlignment); + + if (RectSides.GetValue(ToolStripStatusLabelBorderSides.Top)) + { + if (RadiusSides.GetValue(UICornerRadiusSides.LeftTop)) + { + g.DrawLine(RectColor, Radius / 2 * RectSize, TitleTop, TitleInterval, TitleTop, true, RectSize); + } + else + { + g.DrawLine(RectColor, 0, TitleTop, TitleInterval, TitleTop, true, RectSize); + } + + if (RadiusSides.GetValue(UICornerRadiusSides.RightTop)) + { + g.DrawLine(RectColor, TitleInterval + size.Width, TitleTop, Width - Radius / 2 * RectSize, TitleTop, true, RectSize); + } + else + { + g.DrawLine(RectColor, TitleInterval + size.Width, TitleTop, Width, TitleTop, true, RectSize); + } + } } private int _titleTop = 16;