| File: System\Windows\Forms\Controls\Buttons\ButtonInternal\CheckBoxStandardAdapter.cs | Web Access |
| Project: src\winforms\src\System.Windows.Forms\System.Windows.Forms.csproj (System.Windows.Forms) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Drawing; using System.Windows.Forms.Layout; namespace System.Windows.Forms.ButtonInternal; internal sealed class CheckBoxStandardAdapter : CheckBoxBaseAdapter { internal CheckBoxStandardAdapter(ButtonBase control) : base(control) { } internal override void PaintUp(PaintEventArgs e, CheckState state) { if (Control.Appearance == Appearance.Button) { ButtonAdapter.PaintUp(e, Control.CheckState); } else { ColorData colors = PaintRender(e).Calculate(); LayoutData layout = Layout(e).Layout(); PaintButtonBackground(e, Control.ClientRectangle, null); if (!layout.Options.DotNetOneButtonCompat) { layout.TextBounds.Offset(-1, -1); } layout.ImageBounds.Offset(-1, -1); AdjustFocusRectangle(layout); if (!string.IsNullOrEmpty(Control.Text)) { // Minor adjustment to make sure the appearance is exactly the same as Win32 app. int focusRectFixup = layout.Focus.X & 0x1; // if it's odd, subtract one pixel for fixup. if (!Application.RenderWithVisualStyles) { focusRectFixup = 1 - focusRectFixup; } layout.Focus.Offset(-(focusRectFixup + 1), -2); layout.Focus.Width = layout.TextBounds.Width + layout.ImageBounds.Width - 1; layout.Focus.Intersect(layout.TextBounds); if (layout.Options.TextAlign != LayoutUtils.AnyLeft && layout.Options.UseCompatibleTextRendering && layout.Options.Font.Italic) { // Fixup for GDI+ text rendering. layout.Focus.Width += 2; } } PaintImage(e, layout); DrawCheckBox(e, layout); PaintField(e, layout, colors, colors.WindowText, drawFocus: true); } } internal override void PaintDown(PaintEventArgs e, CheckState state) { if (Control.Appearance == Appearance.Button) { ButtonAdapter.PaintDown(e, Control.CheckState); } else { PaintUp(e, state); } } internal override void PaintOver(PaintEventArgs e, CheckState state) { if (Control.Appearance == Appearance.Button) { ButtonAdapter.PaintOver(e, Control.CheckState); } else { PaintUp(e, state); } } internal override Size GetPreferredSizeCore(Size proposedSize) { if (Control.Appearance == Appearance.Button) { ButtonStandardAdapter adapter = new(Control); return adapter.GetPreferredSizeCore(proposedSize); } else { LayoutOptions? options = default; using (var screen = GdiCache.GetScreenHdc()) using (PaintEventArgs pe = new(screen, clipRect: default)) { options = Layout(pe); } return options.GetPreferredSizeCore(proposedSize); } } private new ButtonStandardAdapter ButtonAdapter => (ButtonStandardAdapter)base.ButtonAdapter; protected override ButtonBaseAdapter CreateButtonAdapter() => new ButtonStandardAdapter(Control); protected override LayoutOptions Layout(PaintEventArgs e) { LayoutOptions layout = CommonLayout(); layout.CheckPaddingSize = 1; layout.DotNetOneButtonCompat = !Application.RenderWithVisualStyles; if (Application.RenderWithVisualStyles) { using var screen = GdiCache.GetScreenHdc(); layout.CheckSize = CheckBoxRenderer.GetGlyphSize( screen, CheckBoxRenderer.ConvertFromButtonState( GetState(), isMixed: true, Control.MouseIsOver), Control.HWNDInternal).Width; } else { layout.CheckSize = ScaleHelper.IsThreadPerMonitorV2Aware ? Control.LogicalToDeviceUnits(layout.CheckSize) : (int)(layout.CheckSize * GetDpiScaleRatio()); } return layout; } }