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