Skip to content

Commit 5dd5006

Browse files
First batch of addressed review suggestions.
1 parent 3fe3534 commit 5dd5006

File tree

6 files changed

+88
-54
lines changed

6 files changed

+88
-54
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1549,7 +1549,7 @@ public ToolStripRenderMode RenderMode
15491549
return ToolStripRenderMode.ManagerRenderMode;
15501550
}
15511551

1552-
if (_renderer is not null && !_renderer.IsAutoGenerated)
1552+
if (_renderer is not null && !_renderer.IsSystemDefaultAlternative)
15531553
{
15541554
return ToolStripRenderMode.Custom;
15551555
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ public static ToolStripManagerRenderMode RenderMode
489489
{
490490
Type currentType = CurrentRendererType;
491491

492-
if (t_defaultRenderer is not null && !t_defaultRenderer.IsAutoGenerated)
492+
if (t_defaultRenderer is not null && !t_defaultRenderer.IsSystemDefaultAlternative)
493493
{
494494
return ToolStripManagerRenderMode.Custom;
495495
}

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

Lines changed: 57 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public abstract class ToolStripRenderer
3737
private static ColorMatrix? s_disabledImageColorMatrix;
3838

3939
private EventHandlerList? _events;
40-
private readonly bool _isAutoGenerated;
40+
private readonly bool _isSystemDefaultAlternative;
4141

4242
private static bool s_isScalingInitialized;
4343
internal int _previousDeviceDpi = ScaleHelper.InitialSystemDpi;
@@ -52,28 +52,12 @@ public abstract class ToolStripRenderer
5252
private static int s_offset4X = OFFSET_4PIXELS;
5353
private static int s_offset4Y = OFFSET_4PIXELS;
5454

55-
// Used in building up the half pyramid of rectangles that are drawn in a
56-
// status strip sizing grip.
57-
private static readonly Rectangle[] s_baseSizeGripRectangles =
58-
[
59-
new(12, 0, 2, 2),
60-
new(8, 4, 2, 2),
61-
new(4, 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),
69-
];
70-
7155
protected ToolStripRenderer()
7256
{
7357
}
7458

7559
internal ToolStripRenderer(bool isAutoGenerated) =>
76-
_isAutoGenerated = isAutoGenerated;
60+
_isSystemDefaultAlternative = isAutoGenerated;
7761

7862
// Used in building disabled images.
7963
private static ColorMatrix DisabledImageColorMatrix
@@ -153,7 +137,13 @@ private EventHandlerList Events
153137
}
154138
}
155139

156-
internal bool IsAutoGenerated => _isAutoGenerated;
140+
/// <summary>
141+
/// Defines, if there is a variation of the system default renderer, that is chosen by the system
142+
/// to address the current environment context. Like DarkMode, HighContrast, LowRes etc.
143+
/// (Used to be 'AutoGenerated', presuming to indicate, that the renderer was 'generated' (picked) by the system.)
144+
/// </summary>
145+
internal bool IsSystemDefaultAlternative
146+
=> _isSystemDefaultAlternative;
157147

158148
// if we're in a low contrast, high resolution situation, use this renderer under the covers instead.
159149
internal virtual ToolStripRenderer? RendererOverride => null;
@@ -1012,39 +1002,57 @@ protected virtual void OnRenderToolStripStatusLabelBackground(ToolStripItemRende
10121002
}
10131003
}
10141004

1005+
// Used in building up the half pyramid of rectangles that are drawn in a
1006+
// status strip sizing grip.
1007+
private static readonly Rectangle[] s_baseSizeGripRectangles =
1008+
[
1009+
new(12, 0, 2, 2),
1010+
new(8, 4, 2, 2),
1011+
new(4, 8, 2, 2),
1012+
new(0, 12, 2, 2),
1013+
new(8, 0, 2, 2),
1014+
new(4, 4, 2, 2),
1015+
new(0, 8, 2, 2),
1016+
new(4, 0, 2, 2),
1017+
new(0, 4, 2, 2),
1018+
new(1, 1, 2, 2),
1019+
];
1020+
10151021
protected virtual void OnRenderStatusStripSizingGrip(ToolStripRenderEventArgs e)
10161022
{
10171023
ArgumentNullException.ThrowIfNull(e);
10181024

1025+
if (RendererOverride is not null)
1026+
{
1027+
RendererOverride.OnRenderStatusStripSizingGrip(e);
1028+
return;
1029+
}
1030+
10191031
OnRenderStatusStripSizingGrip(
10201032
eArgs: e,
10211033
highLightBrush: SystemBrushes.ButtonHighlight,
1022-
shadowBrush: SystemBrushes.ButtonShadow);
1034+
shadowBrush: SystemBrushes.GrayText);
10231035
}
10241036

1025-
private protected void OnRenderStatusStripSizingGrip(
1037+
private protected static void OnRenderStatusStripSizingGrip(
10261038
ToolStripRenderEventArgs eArgs,
10271039
Brush highLightBrush,
10281040
Brush shadowBrush)
10291041
{
1030-
if (RendererOverride is not null)
1031-
{
1032-
RendererOverride.OnRenderStatusStripSizingGrip(eArgs);
1033-
return;
1034-
}
1035-
10361042
if (eArgs.ToolStrip is not StatusStrip statusStrip)
10371043
{
10381044
return;
10391045
}
10401046

10411047
Rectangle sizeGripBounds = statusStrip.SizeGripBounds;
1048+
10421049
if (LayoutUtils.IsZeroWidthOrHeight(sizeGripBounds))
10431050
{
10441051
return;
10451052
}
10461053

10471054
Graphics g = eArgs.Graphics;
1055+
ReadOnlySpan<Rectangle> baseRects = s_baseSizeGripRectangles;
10481056

10491057
// Use device DPI for scaling
10501058
float dpiScale = 1.0f;
@@ -1054,12 +1062,13 @@ private protected void OnRenderStatusStripSizingGrip(
10541062
dpiScale = statusStrip.DeviceDpi / 96f;
10551063
}
10561064

1057-
// Scale the base rectangles for the grip dots
1058-
Rectangle[] scaledRects = new Rectangle[s_baseSizeGripRectangles.Length];
1065+
// Create a buffer on the stack for the scaled rectangles
1066+
Span<Rectangle> scaledRects = stackalloc Rectangle[baseRects.Length];
10591067

1060-
for (int i = 0; i < s_baseSizeGripRectangles.Length; i++)
1068+
// Scale the base rectangles for the grip dots
1069+
for (int i = 0; i < baseRects.Length; i++)
10611070
{
1062-
Rectangle r = s_baseSizeGripRectangles[i];
1071+
Rectangle r = baseRects[i];
10631072

10641073
scaledRects[i] = new Rectangle(
10651074
(int)(r.X * dpiScale),
@@ -1074,40 +1083,49 @@ private protected void OnRenderStatusStripSizingGrip(
10741083
SmoothingMode oldSmoothing = g.SmoothingMode;
10751084
g.SmoothingMode = SmoothingMode.AntiAlias;
10761085

1086+
// Optimize for RTL check by determining the calculation function once
1087+
bool isRtl = statusStrip.RightToLeft == RightToLeft.Yes;
1088+
10771089
// Draw the grip dots, bottom-right aligned (mirrored for RTL)
1078-
foreach (Rectangle dotRect in scaledRects)
1090+
Span<Rectangle> workingRects = stackalloc Rectangle[3]; // actualRect, highlightRect, shadowRect
1091+
1092+
for (int i = 0; i < scaledRects.Length; i++)
10791093
{
1080-
Rectangle actualRect = statusStrip.RightToLeft == RightToLeft.Yes
1094+
ref Rectangle dotRect = ref scaledRects[i];
1095+
ref Rectangle actualRect = ref workingRects[0];
1096+
ref Rectangle highlightRect = ref workingRects[1];
1097+
ref Rectangle shadowRect = ref workingRects[2];
1098+
1099+
actualRect = isRtl
10811100
? new Rectangle(
10821101
x: sizeGripBounds.Left + cornerOffset + dotRect.X,
10831102
y: sizeGripBounds.Bottom - cornerOffset - dotRect.Y - dotRect.Height,
10841103
width: dotRect.Width,
10851104
height: dotRect.Height)
1086-
10871105
: new Rectangle(
10881106
x: sizeGripBounds.Right - cornerOffset - dotRect.X - dotRect.Width,
10891107
y: sizeGripBounds.Bottom - cornerOffset - dotRect.Y - dotRect.Height,
10901108
width: dotRect.Width,
10911109
height: dotRect.Height);
10921110

10931111
// Highlight dot (top-left)
1094-
Rectangle highlightRect = actualRect;
1112+
highlightRect = actualRect;
10951113
highlightRect.Offset(-1, -1);
1096-
10971114
g.FillEllipse(highLightBrush, highlightRect);
10981115

10991116
// Shadow dot (bottom-right)
1100-
Rectangle shadowRect = actualRect;
1117+
shadowRect = actualRect;
11011118
shadowRect.Offset(1, 1);
1102-
11031119
g.FillEllipse(shadowBrush, shadowRect);
11041120
}
11051121

11061122
g.SmoothingMode = oldSmoothing;
11071123

1124+
// We need to account for Windows 11+ AND whatever styled corners we have.
11081125
static (int cornerOffset, Rectangle rect) GetCornerOffset(StatusStrip statusStrip)
11091126
{
1110-
(int, Rectangle) cornerDef = (2, new(1, 1, 2, 2));
1127+
// Default values
1128+
(int offset, Rectangle rect) cornerDef = (2, new(1, 1, 2, 2));
11111129

11121130
if (Environment.OSVersion.Version >= new Version(10, 0, 22000)
11131131
&& statusStrip.FindForm() is Form f)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public ToolStripRenderMode RenderMode
8080
return ToolStripRenderMode.ManagerRenderMode;
8181
}
8282

83-
if (_renderer is not null && !_renderer.IsAutoGenerated)
83+
if (_renderer is not null && !_renderer.IsSystemDefaultAlternative)
8484
{
8585
return ToolStripRenderMode.Custom;
8686
}

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,12 @@ public ToolStripSystemDarkModeRenderer()
2727
/// <summary>
2828
/// Initializes a new instance of the ToolStripSystemDarkModeRenderer class with the specified default state.
2929
/// </summary>
30-
/// <param name="isDefault">true if this is the default renderer; otherwise, false.</param>
31-
internal ToolStripSystemDarkModeRenderer(bool isDefault) : base(isDefault)
30+
/// <param name="isSystemDefaultAlternative">
31+
/// True if this should be seen as a variation of the default renderer
32+
/// (so, no _custom_ renderer provided by the user); otherwise, false.
33+
/// </param>
34+
internal ToolStripSystemDarkModeRenderer(bool isSystemDefaultAlternative)
35+
: base(isSystemDefaultAlternative)
3236
{
3337
}
3438

@@ -171,7 +175,7 @@ protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e)
171175
/// Renders the StatusStrip background in dark mode.
172176
/// </summary>
173177
/// <param name="e">A ToolStripRenderEventArgs that contains the event data.</param>
174-
private static void RenderStatusStripBackground(ToolStripRenderEventArgs e)
178+
internal static void RenderStatusStripBackground(ToolStripRenderEventArgs e)
175179
{
176180
Graphics g = e.Graphics;
177181
Rectangle bounds = e.AffectedBounds;

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

Lines changed: 21 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(systemRenderMode: false);
42+
_toolStripHighContrastRenderer ??= new ToolStripHighContrastRenderer(systemRenderMode: true);
4343
return _toolStripHighContrastRenderer;
4444
}
4545
}
@@ -51,7 +51,7 @@ internal ToolStripRenderer DarkModeRenderer
5151
{
5252
get
5353
{
54-
_toolStripDarkModeRenderer ??= new ToolStripSystemDarkModeRenderer(isDefault: false);
54+
_toolStripDarkModeRenderer ??= new ToolStripSystemDarkModeRenderer(isSystemDefaultAlternative: true);
5555
return _toolStripDarkModeRenderer;
5656
}
5757
}
@@ -218,6 +218,18 @@ private static ToolBarState GetToolBarState(ToolStripItem item)
218218
/// </summary>
219219
protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e)
220220
{
221+
// It is not entirely clear, why we're not leaving it to the respective renderers
222+
// what to do here, but for keeping as much as possible of the original behavior,
223+
// we need to check if the renderer override is set, test for particular renderer types
224+
// and then decide what to do.
225+
if (RendererOverride is ToolStripSystemDarkModeRenderer darkModeRenderer
226+
&& darkModeRenderer.IsSystemDefaultAlternative)
227+
{
228+
base.OnRenderToolStripBackground(e);
229+
230+
return;
231+
}
232+
221233
ToolStrip toolStrip = e.ToolStrip;
222234
Graphics g = e.Graphics;
223235
Rectangle bounds = e.AffectedBounds;
@@ -240,18 +252,18 @@ protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e)
240252
else if (DisplayInformation.LowResolution)
241253
{
242254
FillBackground(g, bounds, (toolStrip is ToolStripDropDown)
243-
? e.BackColor
244-
: SystemColors.ControlLight);
255+
? SystemColors.ControlLight
256+
: e.BackColor);
245257
}
246258
else if (toolStrip.IsDropDown)
247259
{
248-
FillBackground(g, bounds, (!ToolStripManager.VisualStylesEnabled)
260+
FillBackground(g, bounds, ToolStripManager.VisualStylesEnabled
249261
? SystemColors.Menu
250262
: e.BackColor);
251263
}
252264
else if (toolStrip is MenuStrip)
253265
{
254-
FillBackground(g, bounds, (!ToolStripManager.VisualStylesEnabled)
266+
FillBackground(g, bounds, ToolStripManager.VisualStylesEnabled
255267
? SystemColors.MenuBar
256268
: e.BackColor);
257269
}
@@ -264,9 +276,9 @@ protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e)
264276
}
265277
else
266278
{
267-
FillBackground(g, bounds, (!ToolStripManager.VisualStylesEnabled)
268-
? e.BackColor
269-
: SystemColors.MenuBar);
279+
FillBackground(g, bounds, ToolStripManager.VisualStylesEnabled
280+
? SystemColors.MenuBar
281+
: e.BackColor);
270282
}
271283
}
272284
}

0 commit comments

Comments
 (0)