|
// 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;
}
}
}
|