前言:在Winform中,对于鼠标移入效果,大部分人可能会认为不就是分别在鼠标移入和移出事件中,对控件的背景色进行改变吗?
嗯,确实是这样的,但是不知道有没有考虑过下面这个问题:就是这个移入的颜色是手动传入的吗?如果是的话,那么问题就来了。当自定义改变这个控件背景色的时候,移入颜色应做如何的调整?为什么系统自带的按钮可以不传入颜色就全支持呢?如果是自动更改的话?那要如何变化呢?.
所以,下面要写的就是,如何根据控件的背景色动态调整鼠标移入的颜色。
其实原理很简单,可以利用背景颜色的RGB值,对其进行加减操作,就会实现颜色的加深或者减淡,下面看下代码
public static class ColorEx
{
/// <summary>
/// 颜色加深
/// </summary>
/// <param name="color"></param>
/// <param name="deepenFactor">调整因子,值越大颜色越暗</param>
/// <returns></returns>
public static Color Deepen(this Color color, int deepenFactor = 50)
{
byte R = color.R, G = color.G, B = color.B;
if (color.R < deepenFactor)
{
R += (byte)deepenFactor;
}
if (color.G < deepenFactor)
{
G += (byte)deepenFactor;
}
if (color.B < deepenFactor)
{
B += (byte)deepenFactor;
}
Color deepenColor = Color.FromArgb(R - deepenFactor, G - deepenFactor, B - deepenFactor);
return deepenColor;
}
/// <summary>
/// 颜色减淡
/// </summary>
/// <param name="color"></param>
/// <param name="dodgeFactor">调整因子,值越大颜色越亮</param>
/// <returns></returns>
public static Color Dodge(this Color color, int dodgeFactor = 50)
{
byte R = color.R, G = color.G, B = color.B;
if (color.R + dodgeFactor > 255)
{
R -= (byte)dodgeFactor;
}
if (color.G + dodgeFactor > 255)
{
G -= (byte)dodgeFactor;
}
if (color.B + dodgeFactor > 255)
{
B -= (byte)dodgeFactor;
}
Color dodgeColor = Color.FromArgb(R + dodgeFactor, G + dodgeFactor, B + dodgeFactor);
return dodgeColor;
}
}
上面是写了一个Color的扩展方法,应该如何使用呢?在鼠标移入的时候去获取背景颜色加深后的值就可以自动得到移入的颜色BackColor.Deepen()
;然后做后续的处理就可以了。