File: System\Windows\Forms\Controls\Buttons\ButtonInternal\ButtonBaseAdapter.ColorOptions.cs
Web Access
Project: src\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;
 
namespace System.Windows.Forms.ButtonInternal;
 
internal abstract partial class ButtonBaseAdapter
{
    internal class ColorOptions
    {
        private readonly Color _backColor;
        private readonly Color _foreColor;
        private readonly IDeviceContext _deviceContext;
 
        public bool Enabled { get; set; }
        public bool HighContrast { get; }
 
        internal ColorOptions(IDeviceContext deviceContext, Color foreColor, Color backColor)
        {
            _deviceContext = deviceContext;
            _backColor = backColor;
            _foreColor = foreColor;
            HighContrast = SystemInformation.HighContrast;
        }
 
        internal static int Adjust255(float percentage, int value)
        {
            int result = (int)(percentage * value);
            return result > 255 ? 255 : result;
        }
 
        internal ColorData Calculate()
        {
            ColorData colors = new(this)
            {
                ButtonFace = _backColor
            };
 
            if (_backColor == SystemColors.Control)
            {
                colors.ButtonShadow = SystemColors.ControlDark;
                colors.ButtonShadowDark = SystemColors.ControlDarkDark;
                colors.Highlight = SystemColors.ControlLightLight;
            }
            else
            {
                if (!HighContrast)
                {
                    colors.ButtonShadow = ControlPaint.Dark(_backColor);
                    colors.ButtonShadowDark = ControlPaint.DarkDark(_backColor);
                    colors.Highlight = ControlPaint.LightLight(_backColor);
                }
                else
                {
                    colors.ButtonShadow = ControlPaint.Dark(_backColor);
                    colors.ButtonShadowDark = ControlPaint.LightLight(_backColor);
                    colors.Highlight = ControlPaint.LightLight(_backColor);
                }
            }
 
            colors.WindowDisabled = HighContrast ? SystemColors.GrayText : colors.ButtonShadow;
 
            const float lowlight = .1f;
            float adjust = 1 - lowlight;
 
            if (colors.ButtonFace.GetBrightness() < .5)
            {
                adjust = 1 + lowlight * 2;
            }
 
            colors.LowButtonFace = Color.FromArgb(
                Adjust255(adjust, colors.ButtonFace.R),
                Adjust255(adjust, colors.ButtonFace.G),
                Adjust255(adjust, colors.ButtonFace.B));
 
            adjust = 1 - lowlight;
            if (colors.Highlight.GetBrightness() < .5)
            {
                adjust = 1 + lowlight * 2;
            }
 
            colors.LowHighlight = Color.FromArgb(
                Adjust255(adjust, colors.Highlight.R),
                Adjust255(adjust, colors.Highlight.G),
                Adjust255(adjust, colors.Highlight.B));
 
            if (HighContrast && _backColor != SystemColors.Control)
            {
                colors.Highlight = colors.LowHighlight;
            }
 
            colors.WindowFrame = _foreColor;
 
            colors.ContrastButtonShadow = colors.ButtonFace.GetBrightness() < .5 ? colors.LowHighlight : colors.ButtonShadow;
 
            if (!Enabled)
            {
                colors.WindowText = colors.WindowDisabled;
                if (HighContrast)
                {
                    colors.WindowFrame = colors.WindowDisabled;
                    colors.ButtonShadow = colors.WindowDisabled;
                }
            }
            else
            {
                colors.WindowText = colors.WindowFrame;
            }
 
            using DeviceContextHdcScope hdc = _deviceContext.ToHdcScope(ApplyGraphicsProperties.None);
 
            colors.ButtonFace = hdc.FindNearestColor(colors.ButtonFace);
            colors.ButtonShadow = hdc.FindNearestColor(colors.ButtonShadow);
            colors.ButtonShadowDark = hdc.FindNearestColor(colors.ButtonShadowDark);
            colors.ContrastButtonShadow = hdc.FindNearestColor(colors.ContrastButtonShadow);
            colors.WindowText = hdc.FindNearestColor(colors.WindowText);
            colors.Highlight = hdc.FindNearestColor(colors.Highlight);
            colors.LowHighlight = hdc.FindNearestColor(colors.LowHighlight);
            colors.LowButtonFace = hdc.FindNearestColor(colors.LowButtonFace);
            colors.WindowFrame = hdc.FindNearestColor(colors.WindowFrame);
            colors.WindowDisabled = hdc.FindNearestColor(colors.WindowDisabled);
 
            return colors;
        }
    }
}