Skip to content

Commit 17ca3ac

Browse files
Change Grip renderer to use predefined shape.
1 parent 3b11830 commit 17ca3ac

File tree

4 files changed

+77
-62
lines changed

4 files changed

+77
-62
lines changed

src/System.Windows.Forms/System/Windows/Forms/Controls/ToolStrips/ToolStrip.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3250,7 +3250,7 @@ protected override void OnLayout(LayoutEventArgs e)
32503250
{
32513251
LayoutRequired = false;
32523252

3253-
// we need to do this to prevent autosizing to happen while we're reparenting.
3253+
// we need to do this to prevent auto-sizing to happen while we're reparenting.
32543254
ToolStripOverflow? overflow = GetOverflow();
32553255
if (overflow is not null)
32563256
{
@@ -3648,12 +3648,6 @@ protected override void OnPaintBackground(PaintEventArgs e)
36483648
}
36493649
}
36503650

3651-
if (Renderer.RendererOverride is ToolStripRenderer renderer)
3652-
{
3653-
renderer.DrawToolStripBackground(new ToolStripRenderEventArgs(g, this));
3654-
return;
3655-
}
3656-
36573651
Renderer.DrawToolStripBackground(new ToolStripRenderEventArgs(g, this));
36583652
}
36593653
finally

src/System.Windows.Forms/System/Windows/Forms/Controls/ToolStrips/ToolStripRenderer.cs

Lines changed: 66 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System.ComponentModel;
55
using System.Drawing;
6+
using System.Drawing.Drawing2D;
67
using System.Drawing.Imaging;
78
using System.Drawing.Text;
89
using System.Windows.Forms.Layout;
@@ -55,12 +56,16 @@ public abstract class ToolStripRenderer
5556
// status strip sizing grip.
5657
private static readonly Rectangle[] s_baseSizeGripRectangles =
5758
[
58-
new(8, 0, 2, 2),
59+
new(12, 0, 2, 2),
5960
new(8, 4, 2, 2),
60-
new(8, 8, 2, 2),
61-
new(4, 4, 2, 2),
6261
new(4, 8, 2, 2),
63-
new(0, 8, 2, 2)
62+
new(0, 12, 2, 2),
63+
new(8, 0, 2, 2),
64+
new(4, 4, 2, 2),
65+
new(0, 8, 2, 2),
66+
new(4, 0, 2, 2),
67+
new(0, 4, 2, 2),
68+
new(1, 1, 2, 2),
6469
];
6570

6671
protected ToolStripRenderer()
@@ -1028,78 +1033,94 @@ private protected void OnRenderStatusStripSizingGrip(
10281033
return;
10291034
}
10301035

1031-
Graphics g = eArgs.Graphics;
1032-
1033-
// we have a set of stock rectangles. Translate them over to where the grip is to be drawn
1034-
// for the white set, then translate them up and right one pixel for the grey.
1035-
10361036
if (eArgs.ToolStrip is not StatusStrip statusStrip)
10371037
{
10381038
return;
10391039
}
10401040

10411041
Rectangle sizeGripBounds = statusStrip.SizeGripBounds;
1042-
10431042
if (LayoutUtils.IsZeroWidthOrHeight(sizeGripBounds))
10441043
{
10451044
return;
10461045
}
10471046

1048-
Rectangle[] whiteRectangles = new Rectangle[s_baseSizeGripRectangles.Length];
1049-
Rectangle[] greyRectangles = new Rectangle[s_baseSizeGripRectangles.Length];
1047+
Graphics g = eArgs.Graphics;
1048+
1049+
// Use device DPI for scaling
1050+
float dpiScale = 1.0f;
10501051

1051-
for (int i = 0; i < s_baseSizeGripRectangles.Length; i++)
1052+
if (statusStrip.DeviceDpi > 0 && ScaleHelper.IsThreadPerMonitorV2Aware)
10521053
{
1053-
Rectangle baseRect = s_baseSizeGripRectangles[i];
1054+
dpiScale = statusStrip.DeviceDpi / 96f;
1055+
}
10541056

1055-
if (statusStrip.RightToLeft == RightToLeft.Yes)
1056-
{
1057-
baseRect.X = sizeGripBounds.Width - baseRect.X - baseRect.Width;
1058-
}
1057+
// Scale the base rectangles for the grip dots
1058+
Rectangle[] scaledRects = new Rectangle[s_baseSizeGripRectangles.Length];
10591059

1060-
// Height of pyramid (10px) + 2px padding from bottom.
1061-
baseRect.Offset(
1062-
x: sizeGripBounds.X,
1063-
y: sizeGripBounds.Bottom - 12);
1060+
for (int i = 0; i < s_baseSizeGripRectangles.Length; i++)
1061+
{
1062+
Rectangle r = s_baseSizeGripRectangles[i];
10641063

1065-
whiteRectangles[i] = baseRect;
1064+
scaledRects[i] = new Rectangle(
1065+
(int)(r.X * dpiScale),
1066+
(int)(r.Y * dpiScale),
1067+
Math.Max((int)(r.Width * dpiScale), 2),
1068+
Math.Max((int)(r.Height * dpiScale), 2));
1069+
}
10661070

1067-
int offset = -1 + GetCornerOffset(statusStrip);
1071+
(int cornerOffset, Rectangle lastRect) = GetCornerOffset(statusStrip);
1072+
scaledRects[^1] = lastRect;
10681073

1069-
if (statusStrip.RightToLeft == RightToLeft.Yes)
1070-
{
1071-
baseRect.Offset(1, -1 - offset);
1072-
}
1073-
else
1074-
{
1075-
baseRect.Offset(-1, -1 - offset);
1076-
}
1074+
SmoothingMode oldSmoothing = g.SmoothingMode;
1075+
g.SmoothingMode = SmoothingMode.AntiAlias;
10771076

1078-
greyRectangles[i] = baseRect;
1077+
// Draw the grip dots, bottom-right aligned (mirrored for RTL)
1078+
foreach (Rectangle dotRect in scaledRects)
1079+
{
1080+
Rectangle actualRect = statusStrip.RightToLeft == RightToLeft.Yes
1081+
? new Rectangle(
1082+
x: sizeGripBounds.Left + cornerOffset + dotRect.X,
1083+
y: sizeGripBounds.Bottom - cornerOffset - dotRect.Y - dotRect.Height,
1084+
width: dotRect.Width,
1085+
height: dotRect.Height)
1086+
1087+
: new Rectangle(
1088+
x: sizeGripBounds.Right - cornerOffset - dotRect.X - dotRect.Width,
1089+
y: sizeGripBounds.Bottom - cornerOffset - dotRect.Y - dotRect.Height,
1090+
width: dotRect.Width,
1091+
height: dotRect.Height);
1092+
1093+
// Highlight dot (top-left)
1094+
Rectangle highlightRect = actualRect;
1095+
highlightRect.Offset(-1, -1);
1096+
1097+
g.FillEllipse(highLightBrush, highlightRect);
1098+
1099+
// Shadow dot (bottom-right)
1100+
Rectangle shadowRect = actualRect;
1101+
shadowRect.Offset(1, 1);
1102+
1103+
g.FillEllipse(shadowBrush, shadowRect);
10791104
}
10801105

1081-
g.FillRectangles(highLightBrush, whiteRectangles);
1082-
g.FillRectangles(shadowBrush, greyRectangles);
1106+
g.SmoothingMode = oldSmoothing;
10831107

1084-
// We need to compensate for the rounded Window corners from Windows 11 on.
1085-
static int GetCornerOffset(StatusStrip statusStrip)
1108+
static (int cornerOffset, Rectangle rect) GetCornerOffset(StatusStrip statusStrip)
10861109
{
1087-
// If we're on Windows 11, offset slightly to avoid hitting rounded corners,
1088-
// _if_ we are at all dealing with rounded corners.
1089-
int cornerOffset = 0;
1110+
(int, Rectangle) cornerDef = (2, new(1, 1, 2, 2));
10901111

10911112
if (Environment.OSVersion.Version >= new Version(10, 0, 22000)
10921113
&& statusStrip.FindForm() is Form f)
10931114
{
1094-
cornerOffset = f.FormCornerPreference switch
1115+
cornerDef = f.FormCornerPreference switch
10951116
{
1096-
FormCornerPreference.Round => 5,
1097-
FormCornerPreference.RoundSmall => 3,
1098-
_ => 3
1117+
FormCornerPreference.Round => (4, new(1, 1, 2, 2)),
1118+
FormCornerPreference.RoundSmall => (3, new(1, 1, 2, 2)),
1119+
_ => (2, new(0, 0, 2, 2))
10991120
};
11001121
}
11011122

1102-
return cornerOffset;
1123+
return cornerDef;
11031124
}
11041125
}
11051126

src/System.Windows.Forms/System/Windows/Forms/Controls/ToolStrips/ToolStripSystemDarkModeRenderer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,7 @@ protected override void OnRenderStatusStripSizingGrip(ToolStripRenderEventArgs e
677677
{
678678
ArgumentNullException.ThrowIfNull(e);
679679

680-
using var highLightBrush = GetDarkModeBrush(SystemColors.ButtonHighlight);
680+
using var highLightBrush = GetDarkModeBrush(SystemColors.GrayText);
681681
using var shadowBrush = GetDarkModeBrush(SystemColors.ButtonShadow);
682682

683683
OnRenderStatusStripSizingGrip(

src/System.Windows.Forms/System/Windows/Forms/Controls/ToolStrips/ToolStripSystemRenderer.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ internal ToolStripRenderer HighContrastRenderer
3939
{
4040
get
4141
{
42-
_toolStripHighContrastRenderer ??= new ToolStripHighContrastRenderer(/*renderLikeSystem*/true);
42+
_toolStripHighContrastRenderer ??= new ToolStripHighContrastRenderer(systemRenderMode: false);
4343
return _toolStripHighContrastRenderer;
4444
}
4545
}
@@ -51,7 +51,7 @@ internal ToolStripRenderer DarkModeRenderer
5151
{
5252
get
5353
{
54-
_toolStripDarkModeRenderer ??= new ToolStripSystemDarkModeRenderer();
54+
_toolStripDarkModeRenderer ??= new ToolStripSystemDarkModeRenderer(isDefault: false);
5555
return _toolStripDarkModeRenderer;
5656
}
5757
}
@@ -240,18 +240,18 @@ protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e)
240240
else if (DisplayInformation.LowResolution)
241241
{
242242
FillBackground(g, bounds, (toolStrip is ToolStripDropDown)
243-
? SystemColors.ControlLight
244-
: e.BackColor);
243+
? e.BackColor
244+
: SystemColors.ControlLight);
245245
}
246246
else if (toolStrip.IsDropDown)
247247
{
248-
FillBackground(g, bounds, ToolStripManager.VisualStylesEnabled
248+
FillBackground(g, bounds, (!ToolStripManager.VisualStylesEnabled)
249249
? SystemColors.Menu
250250
: e.BackColor);
251251
}
252252
else if (toolStrip is MenuStrip)
253253
{
254-
FillBackground(g, bounds, ToolStripManager.VisualStylesEnabled
254+
FillBackground(g, bounds, (!ToolStripManager.VisualStylesEnabled)
255255
? SystemColors.MenuBar
256256
: e.BackColor);
257257
}
@@ -264,9 +264,9 @@ protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e)
264264
}
265265
else
266266
{
267-
FillBackground(g, bounds, ToolStripManager.VisualStylesEnabled
268-
? SystemColors.MenuBar
269-
: e.BackColor);
267+
FillBackground(g, bounds, (!ToolStripManager.VisualStylesEnabled)
268+
? e.BackColor
269+
: SystemColors.MenuBar);
270270
}
271271
}
272272
}

0 commit comments

Comments
 (0)