442 lines
18 KiB
C#
442 lines
18 KiB
C#
namespace DevComponents.DotNetBar
|
|
{
|
|
using System;
|
|
using System.Drawing;
|
|
|
|
/// <summary>
|
|
/// Summary description for ColorFunctions.
|
|
/// </summary>
|
|
public class ColorFunctions
|
|
{
|
|
private static Color m_HoverBackColor;
|
|
private static Color m_HoverBackColor2;
|
|
private static Color m_HoverBackColor3;
|
|
private static Color m_CheckBoxBackColor;
|
|
private static Color m_MenuBackColor;
|
|
private static Color m_MenuFocusBorderColor;
|
|
private static Color m_PressedBackColor;
|
|
private static Color m_ToolMenuFocusBackColor;
|
|
private static Color m_SideRecentlyBackColor;
|
|
private static Color m_RecentlyUsedOfficeBackColor;
|
|
|
|
private static Bitmap m_PushedBrushBmp = null;
|
|
|
|
internal static bool ColorsLoaded = false;
|
|
|
|
public static void LoadColors()
|
|
{
|
|
RefreshColors();
|
|
if (!ColorsLoaded)
|
|
Microsoft.Win32.SystemEvents.UserPreferenceChanged += new Microsoft.Win32.UserPreferenceChangedEventHandler(ColorFunctions.PreferenceChanged);
|
|
ColorsLoaded = true;
|
|
}
|
|
|
|
private static void PreferenceChanged(object sender, Microsoft.Win32.UserPreferenceChangedEventArgs e)
|
|
{
|
|
RefreshColors();
|
|
NativeFunctions.RefreshSettings();
|
|
BarFunctions.RefreshScreens();
|
|
}
|
|
|
|
private static void RefreshColors()
|
|
{
|
|
if (NativeFunctions.ColorDepth >= 16)
|
|
{
|
|
int red = (int)((System.Drawing.SystemColors.Highlight.R - System.Drawing.SystemColors.Window.R) * .30 + System.Drawing.SystemColors.Window.R);
|
|
int green = (int)((System.Drawing.SystemColors.Highlight.G - System.Drawing.SystemColors.Window.G) * .30 + System.Drawing.SystemColors.Window.G);
|
|
int blue = (int)((System.Drawing.SystemColors.Highlight.B - System.Drawing.SystemColors.Window.B) * .30 + System.Drawing.SystemColors.Window.B);
|
|
m_HoverBackColor = Color.FromArgb(red, green, blue);
|
|
|
|
red = (int)((System.Drawing.SystemColors.Highlight.R - System.Drawing.SystemColors.Window.R) * .45 + System.Drawing.SystemColors.Window.R);
|
|
green = (int)((System.Drawing.SystemColors.Highlight.G - System.Drawing.SystemColors.Window.G) * .45 + System.Drawing.SystemColors.Window.G);
|
|
blue = (int)((System.Drawing.SystemColors.Highlight.B - System.Drawing.SystemColors.Window.B) * .45 + System.Drawing.SystemColors.Window.B);
|
|
m_HoverBackColor2 = Color.FromArgb(red, green, blue);
|
|
|
|
red = (int)((System.Drawing.SystemColors.Highlight.R - System.Drawing.SystemColors.Window.R) * .10 + System.Drawing.SystemColors.Window.R);
|
|
green = (int)((System.Drawing.SystemColors.Highlight.G - System.Drawing.SystemColors.Window.G) * .10 + System.Drawing.SystemColors.Window.G);
|
|
blue = (int)((System.Drawing.SystemColors.Highlight.B - System.Drawing.SystemColors.Window.B) * .10 + System.Drawing.SystemColors.Window.B);
|
|
m_HoverBackColor3 = Color.FromArgb(red, green, blue);
|
|
|
|
red = (int)((System.Drawing.SystemColors.Highlight.R - System.Drawing.SystemColors.Window.R) * .25 + System.Drawing.SystemColors.Window.R);
|
|
green = (int)((System.Drawing.SystemColors.Highlight.G - System.Drawing.SystemColors.Window.G) * .25 + System.Drawing.SystemColors.Window.G);
|
|
blue = (int)((System.Drawing.SystemColors.Highlight.B - System.Drawing.SystemColors.Window.B) * .25 + System.Drawing.SystemColors.Window.B);
|
|
m_CheckBoxBackColor = Color.FromArgb(red, green, blue);
|
|
|
|
if (NativeFunctions.ColorDepth <= 16)
|
|
{
|
|
m_MenuBackColor = System.Drawing.SystemColors.ControlLightLight;
|
|
}
|
|
else
|
|
{
|
|
red = (int)((System.Drawing.SystemColors.Control.R - System.Drawing.Color.White.R) * .20 + System.Drawing.Color.White.R);
|
|
green = (int)((System.Drawing.SystemColors.Control.G - System.Drawing.Color.White.G) * .20 + System.Drawing.Color.White.G);
|
|
blue = (int)((System.Drawing.SystemColors.Control.B - System.Drawing.Color.White.B) * .20 + System.Drawing.Color.White.B);
|
|
m_MenuBackColor = Color.FromArgb(red, green, blue);
|
|
}
|
|
|
|
red = (int)(System.Drawing.SystemColors.ControlDark.R * .80);
|
|
green = (int)(System.Drawing.SystemColors.ControlDark.G * .80);
|
|
blue = (int)(System.Drawing.SystemColors.ControlDark.B * .80);
|
|
m_MenuFocusBorderColor = Color.FromArgb(red, green, blue);
|
|
|
|
// and Highlight color
|
|
red = (int)((System.Drawing.SystemColors.Highlight.R - System.Drawing.SystemColors.Window.R) * .25 + System.Drawing.SystemColors.Window.R);
|
|
green = (int)((System.Drawing.SystemColors.Highlight.G - System.Drawing.SystemColors.Window.G) * .25 + System.Drawing.SystemColors.Window.G);
|
|
blue = (int)((System.Drawing.SystemColors.Highlight.B - System.Drawing.SystemColors.Window.B) * .25 + System.Drawing.SystemColors.Window.B);
|
|
m_PressedBackColor = Color.FromArgb(red, green, blue);
|
|
|
|
red = (int)((System.Drawing.SystemColors.Control.R - System.Drawing.Color.White.R) * .80 + System.Drawing.Color.White.R);
|
|
green = (int)((System.Drawing.SystemColors.Control.G - System.Drawing.Color.White.G) * .80 + System.Drawing.Color.White.G);
|
|
blue = (int)((System.Drawing.SystemColors.Control.B - System.Drawing.Color.White.B) * .80 + System.Drawing.Color.White.B);
|
|
m_ToolMenuFocusBackColor = Color.FromArgb(red, green, blue);
|
|
|
|
red = (int)((System.Drawing.SystemColors.Control.R - System.Drawing.Color.White.R) * .50 + System.Drawing.Color.White.R);
|
|
green = (int)((System.Drawing.SystemColors.Control.G - System.Drawing.Color.White.G) * .50 + System.Drawing.Color.White.G);
|
|
blue = (int)((System.Drawing.SystemColors.Control.B - System.Drawing.Color.White.B) * .50 + System.Drawing.Color.White.B);
|
|
m_RecentlyUsedOfficeBackColor = Color.FromArgb(red, green, blue);
|
|
|
|
m_SideRecentlyBackColor = System.Drawing.SystemColors.Control;
|
|
}
|
|
else
|
|
{
|
|
m_HoverBackColor = System.Drawing.SystemColors.ControlLightLight;
|
|
m_HoverBackColor2 = m_HoverBackColor;
|
|
m_HoverBackColor3 = m_HoverBackColor;
|
|
m_CheckBoxBackColor = System.Drawing.SystemColors.ControlLight;
|
|
m_MenuBackColor = System.Drawing.SystemColors.ControlLightLight;
|
|
m_MenuFocusBorderColor = System.Drawing.SystemColors.ControlDark;
|
|
m_PressedBackColor = System.Drawing.SystemColors.ControlLight;
|
|
m_ToolMenuFocusBackColor = System.Drawing.SystemColors.ControlLight;
|
|
m_RecentlyUsedOfficeBackColor = System.Drawing.SystemColors.ControlLight;
|
|
m_SideRecentlyBackColor = System.Drawing.SystemColors.Control;
|
|
}
|
|
|
|
if (m_PushedBrushBmp != null)
|
|
{
|
|
m_PushedBrushBmp.Dispose();
|
|
m_PushedBrushBmp = new System.Drawing.Bitmap(2, 2);
|
|
m_PushedBrushBmp.SetPixel(0, 0, System.Drawing.SystemColors.Control);
|
|
m_PushedBrushBmp.SetPixel(1, 0, System.Drawing.SystemColors.ControlLightLight);
|
|
m_PushedBrushBmp.SetPixel(0, 1, System.Drawing.SystemColors.ControlLightLight);
|
|
m_PushedBrushBmp.SetPixel(1, 1, System.Drawing.SystemColors.Control);
|
|
}
|
|
}
|
|
|
|
public static Color GetShade(Color color, int shadePercent)
|
|
{
|
|
HLSColor hls = RGBToHSL(color);
|
|
if (hls.Lightness == 0)
|
|
return HLSToRGB(hls.Hue, shadePercent / 100, hls.Saturation);
|
|
else
|
|
return HLSToRGB(hls.Hue, Math.Max(0, (hls.Lightness - shadePercent / 100)), hls.Saturation);
|
|
}
|
|
|
|
public struct HLSColor
|
|
{
|
|
public double Hue;
|
|
public double Lightness;
|
|
public double Saturation;
|
|
}
|
|
//public struct RGBColor
|
|
//{
|
|
// public int Red;
|
|
// public int Green;
|
|
// public int Blue;
|
|
//}
|
|
public static HLSColor RGBToHSL(int Red, int Green, int Blue)
|
|
{
|
|
double Max, Min, delta;
|
|
double rR, rG, rB;
|
|
HLSColor ret = new HLSColor();
|
|
|
|
rR = (double)Red / 255;
|
|
rG = (double)Green / 255;
|
|
rB = (double)Blue / 255;
|
|
|
|
// Given: rgb each in [0,1].
|
|
// Desired: h in [0,360] and s in [0,1], except if s=0, then h=UNDEFINED.}
|
|
Max = Maximum(rR, rG, rB);
|
|
Min = Minimum(rR, rG, rB);
|
|
delta = Max - Min;
|
|
ret.Lightness = (Max + Min) / 2; // {This is the lightness}
|
|
// {Next calculate saturation}
|
|
|
|
if (Max == Min)
|
|
{
|
|
// begin {Acrhomatic case}
|
|
ret.Saturation = 0;
|
|
ret.Hue = 0;
|
|
// end {Acrhomatic case}
|
|
}
|
|
else
|
|
{
|
|
// begin {Chromatic case}
|
|
// {First calculate the saturation.}
|
|
if (ret.Lightness <= 0.5)
|
|
ret.Saturation = (Max - Min) / (Max + Min);
|
|
else
|
|
ret.Saturation = (Max - Min) / (2 - Max - Min);
|
|
// {Next calculate the hue.}
|
|
|
|
double delr = (((Max - rR) / 6) + (delta / 2)) / delta;
|
|
double delg = (((Max - rG) / 6) + (delta / 2)) / delta;
|
|
double delb = (((Max - rB) / 6) + (delta / 2)) / delta;
|
|
|
|
if (rR == Max)
|
|
ret.Hue = delb - delg; //{Resulting color is between yellow and magenta}
|
|
else if (rG == Max)
|
|
ret.Hue = (1d / 3d) + delr - delb; // {Resulting color is between cyan and yellow}
|
|
else if (rB == Max)
|
|
ret.Hue = (2d / 3d) + delg - delr;; // {Resulting color is between magenta and cyan}
|
|
|
|
if (ret.Hue < 0) ret.Hue += 1;
|
|
if (ret.Hue > 1) ret.Hue -= 1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
public static HLSColor RGBToHSL(Color color)
|
|
{
|
|
return RGBToHSL(color.R, color.G, color.B);
|
|
}
|
|
|
|
private static double Maximum(double rR, double rG, double rB)
|
|
{
|
|
double ret = 0;
|
|
if (rR > rG)
|
|
{
|
|
if (rR > rB)
|
|
ret = rR;
|
|
else
|
|
ret = rB;
|
|
}
|
|
else
|
|
{
|
|
if (rB > rG)
|
|
ret = rB;
|
|
else
|
|
ret = rG;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
private static double Minimum(double rR, double rG, double rB)
|
|
{
|
|
double ret = 0;
|
|
if (rR < rG)
|
|
{
|
|
if (rR < rB)
|
|
ret = rR;
|
|
else
|
|
ret = rB;
|
|
}
|
|
else
|
|
{
|
|
if (rB < rG)
|
|
ret = rB;
|
|
else
|
|
ret = rG;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
public static Color HLSToRGB(double Hue, double Lightness, double Saturation)
|
|
{
|
|
if (Lightness < 0) Lightness = 0; else if (Lightness > 1) Lightness = 1;
|
|
if (Saturation < 0) Saturation = 0; else if (Saturation > 1) Saturation = 1;
|
|
|
|
int r, g, b;
|
|
double var1, var2;
|
|
if (Saturation == 0)
|
|
{
|
|
r = (int)(Lightness * 255);
|
|
g = (int)(Lightness * 255);
|
|
b = (int)(Lightness * 255);
|
|
}
|
|
else
|
|
{
|
|
if (Lightness < 0.5)
|
|
{
|
|
var2 = Lightness * (1 + Saturation);
|
|
}
|
|
else
|
|
{
|
|
var2 = (Lightness + Saturation) - (Saturation * Lightness);
|
|
}
|
|
|
|
var1 = 2 * Lightness - var2;
|
|
r = (int)(255 * hue_2_rgb(var1, var2, Hue + (1d / 3d)));
|
|
g = (int)(255 * hue_2_rgb(var1, var2, Hue));
|
|
b = (int)(255 * hue_2_rgb(var1, var2, Hue - (1d / 3d)));
|
|
}
|
|
|
|
return Color.FromArgb(r, g, b);
|
|
}
|
|
|
|
private static double hue_2_rgb(double v1, double v2,double vh)
|
|
{
|
|
if (vh < 0)
|
|
{
|
|
vh += 1;
|
|
}
|
|
|
|
if (vh > 1)
|
|
{
|
|
vh -= 1;
|
|
}
|
|
|
|
if ((6 * vh) < 1)
|
|
{
|
|
return (v1 + (v2 - v1) * 6 * vh);
|
|
};
|
|
|
|
if ((2 * vh) < 1)
|
|
{
|
|
return (v2);
|
|
};
|
|
|
|
if ((3 * vh) < 2)
|
|
{
|
|
return (v1 + (v2 - v1) * ((2d / 3d - vh) * 6));
|
|
};
|
|
|
|
return (v1);
|
|
}
|
|
|
|
public static Color HLSToRGB(HLSColor clr)
|
|
{
|
|
return HLSToRGB(clr.Hue, clr.Lightness, clr.Saturation);
|
|
}
|
|
|
|
public static System.Drawing.Color HoverBackColor()
|
|
{
|
|
return m_HoverBackColor;
|
|
}
|
|
|
|
public static System.Drawing.Color HoverBackColor2()
|
|
{
|
|
return m_HoverBackColor2;
|
|
}
|
|
|
|
public static System.Drawing.Color HoverBackColor3()
|
|
{
|
|
return m_HoverBackColor3;
|
|
}
|
|
|
|
public static System.Drawing.Color HoverBackColor(System.Drawing.Graphics g)
|
|
{
|
|
return g.GetNearestColor(HoverBackColor());
|
|
}
|
|
|
|
public static System.Drawing.Color PressedBackColor()
|
|
{
|
|
return m_PressedBackColor;
|
|
}
|
|
|
|
public static System.Drawing.Color PressedBackColor(System.Drawing.Graphics g)
|
|
{
|
|
return g.GetNearestColor(PressedBackColor());
|
|
}
|
|
|
|
public static System.Drawing.Color CheckBoxBackColor()
|
|
{
|
|
return m_CheckBoxBackColor;
|
|
}
|
|
|
|
public static System.Drawing.Color CheckBoxBackColor(System.Drawing.Graphics g)
|
|
{
|
|
return g.GetNearestColor(CheckBoxBackColor());
|
|
}
|
|
|
|
public static System.Drawing.Color ToolMenuFocusBackColor()
|
|
{
|
|
return m_ToolMenuFocusBackColor;
|
|
}
|
|
|
|
public static System.Drawing.Color RecentlyUsedOfficeBackColor()
|
|
{
|
|
return m_RecentlyUsedOfficeBackColor;
|
|
}
|
|
|
|
public static System.Drawing.Color RecentlyUsedOfficeBackColor(System.Drawing.Graphics g)
|
|
{
|
|
return g.GetNearestColor(RecentlyUsedOfficeBackColor());
|
|
}
|
|
|
|
public static System.Drawing.Color SideRecentlyBackColor(System.Drawing.Graphics g)
|
|
{
|
|
return g.GetNearestColor(SideRecentlyBackColor());
|
|
}
|
|
|
|
public static System.Drawing.Color SideRecentlyBackColor()
|
|
{
|
|
return m_SideRecentlyBackColor;
|
|
}
|
|
|
|
public static System.Drawing.Color ToolMenuFocusBackColor(System.Drawing.Graphics g)
|
|
{
|
|
return g.GetNearestColor(ToolMenuFocusBackColor());
|
|
}
|
|
|
|
public static System.Drawing.Color MenuFocusBorderColor()
|
|
{
|
|
return m_MenuFocusBorderColor;
|
|
}
|
|
|
|
public static System.Drawing.Color MenuFocusBorderColor(System.Drawing.Graphics g)
|
|
{
|
|
return g.GetNearestColor(MenuFocusBorderColor());
|
|
}
|
|
|
|
public static System.Drawing.Color MenuBackColor()
|
|
{
|
|
return m_MenuBackColor;
|
|
}
|
|
|
|
public static System.Drawing.Color MenuBackColor(System.Drawing.Graphics g)
|
|
{
|
|
return g.GetNearestColor(MenuBackColor());
|
|
}
|
|
public static System.Drawing.Brush GetPushedBrush(BaseItem item)
|
|
{
|
|
if (item.Parent is GenericItemContainer)
|
|
{
|
|
if (!((GenericItemContainer)item.Parent).m_BackgroundColor.IsEmpty)
|
|
{
|
|
return new SolidBrush(((GenericItemContainer)item.Parent).m_BackgroundColor);
|
|
}
|
|
}
|
|
else if (item.Parent is SideBarPanelItem)
|
|
{
|
|
if (((SideBarPanelItem)item.Parent).BackgroundStyle.ShouldSerializeBackColor1())
|
|
{
|
|
return new SolidBrush(((SideBarPanelItem)item.Parent).BackgroundStyle.BackColor1.Color);
|
|
}
|
|
else if (((SideBarPanelItem)item.Parent).BackgroundStyle.ShouldSerializeBackColor1())
|
|
{
|
|
return new SolidBrush(((SideBarPanelItem)item.Parent).BackgroundStyle.BackColor1.Color);
|
|
}
|
|
}
|
|
|
|
return ColorFunctions.GetPushedBrush();
|
|
}
|
|
public static System.Drawing.TextureBrush GetPushedBrush()
|
|
{
|
|
if (m_PushedBrushBmp == null)
|
|
{
|
|
m_PushedBrushBmp = new System.Drawing.Bitmap(2, 2);
|
|
m_PushedBrushBmp.SetPixel(0, 0, System.Drawing.SystemColors.Control);
|
|
m_PushedBrushBmp.SetPixel(1, 0, System.Drawing.SystemColors.ControlLightLight);
|
|
m_PushedBrushBmp.SetPixel(0, 1, System.Drawing.SystemColors.ControlLightLight);
|
|
m_PushedBrushBmp.SetPixel(1, 1, System.Drawing.SystemColors.Control);
|
|
}
|
|
return (new System.Drawing.TextureBrush(m_PushedBrushBmp));
|
|
}
|
|
|
|
public static bool IsEqual(Color color1, Color color2)
|
|
{
|
|
return color1.A == color2.A && color1.R == color2.R && color1.G == color2.G && color1.B == color2.B;
|
|
}
|
|
}
|
|
}
|