C# 皮肤美化——按钮
昨天,在 钱李峰的博客 中看了有关按钮皮肤美化的文章。并跟着钱李峰大大的思路做了一遍,发现这个方法比我以前(PictureBox+图片+类库)的方法好太多了,在此特别感谢钱李峰大大。
不知道是什么原因,在拿到别人的代码之后总想要改一下。不想了,以 钱李峰大大的 源代码 为基础,开工吧!
Assembly.GetExecutingAssembly().GetManifestResourceStream("图片的相对路径")
这个方法对我来说,虽然很新奇,但还是很有点麻烦,有什么方法可以代替吗?第一印象就是ImageList控件,而且还有封装好的Transparent透明颜色指定器。马上就动手………………可是,茶几上总是放着杯具的。ImageList控件的呈现图像的颜色数最高是32,所以效果差了;
既然ImageList不行,就打资源文件的主意。把图片都拉进资源文件里面,然后再改一下辅助函数……
代码
#region 构造函数
public LButton()
{
InitializeComponent();
_downImage = MakeTransparent(Properties.Resources.btndown);
_moveImage = MakeTransparent(Properties.Resources.btnfore);
_normalImage = MakeTransparent(Properties.Resources.btnnomal);
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
this.BackgroundImage = _normalImage;
}
#endregion
#region 辅助函数
private Bitmap MakeTransparent(Bitmap bitmap)
{
bitmap.MakeTransparent(_transparentColor);
return bitmap;
}
#endregion
这一次,终于达到目的了。但是,这样的意义好像不大。
既然这样,那就一事不烦二主了。就不用Label+UserControl,直接继承Button类算了。
[DefaultEvent("Click")]//指定组件的默认事件,可以换成其它 public partial class LButton : UserControl {
改成
public partial class LButton : Button {
主意:LButton的属性:FlatStyle=Flat;
同时要在构造函数中再加一句:this.SetStyle(ControlStyles.Selectable, false);//不接收焦点,即去掉按钮的虚线框
最后再加一个“指定背景图中被视为透明的颜色”的属性,这个按钮就改好了。虽然最终结果还是一样,但是我还是修改过了,哈哈哈……
最后最后,还是要再次感谢钱李峰大大。
最终代码:(其实没改多少东西)
代码
public partial class LButton : Button
{
#region 变量
//三种不同状态下的图片
Image _normalImage = null;
Image _moveImage = null;
Image _downImage = null;
Color _transparentColor = Color.Empty;
#endregion
#region 属性
/// <summary>
/// 控件在正常状态下显示的图片
/// </summary>
/// 楼雨:2010-11-2 14:22
[CategoryAttribute("自定义"), DescriptionAttribute("控件在正常状态下显示的图片")]
public Image NormalImage
{
get
{
return _normalImage;
}
set
{
_normalImage = value;
}
}
/// <summary>
/// 鼠标在控件上方按下按钮旱显示的图片
/// </summary>
/// 楼雨:2010-11-2 14:20
[CategoryAttribute("自定义"), DescriptionAttribute("鼠标在控件上方按下按钮时显示的图片")]
public Image DownImage
{
get { return _downImage; }
set
{
_downImage = value;
}
}
/// <summary>
/// 鼠标移过控件时显示的图片
/// </summary>
/// 楼雨:2010-11-2 14:16
[CategoryAttribute("自定义"), DescriptionAttribute("鼠标指针移过控件时显示的图片")]
public Image MoveImage
{
get { return _moveImage; }
set
{
_moveImage = value;
}
}
/// <summary>
/// 指定背景图中被视为透明的颜色
/// </summary>
/// <value>
/// </value>
/// 楼雨:2010-11-2 14:06
[CategoryAttribute("自定义"), DescriptionAttribute("指定背景图中被视为透明的颜色")]
public Color TransparentColor
{
get { return _transparentColor; }
set { _transparentColor = value; }
}
#endregion
#region 构造函数
public LButton()
{
InitializeComponent();
_transparentColor = Color.FromArgb(255, 0, 255);
_downImage = MakeTransparent(Properties.Resources.btndown);
_moveImage = MakeTransparent(Properties.Resources.btnfore);
_normalImage = MakeTransparent(Properties.Resources.btnnomal);
this.SetStyle(ControlStyles.Selectable, false);//不接收焦点,即去掉按钮的虚线框
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
this.BackgroundImage = _normalImage;
}
#endregion
#region 辅助函数
private Bitmap MakeTransparent(Bitmap bitmap)
{
bitmap.MakeTransparent(_transparentColor);
return bitmap;
}
#endregion
#region 事件
private void LButton_MouseDown(object sender, MouseEventArgs e)
{
this.BackgroundImage = _downImage;
}
private void LButton_MouseEnter(object sender, EventArgs e)
{
this.BackgroundImage = _moveImage;
this.Cursor = Cursors.Hand;
}
private void LButton_MouseLeave(object sender, EventArgs e)
{
this.BackgroundImage = _normalImage;
this.Cursor = Cursors.Default;
}
private void LButton_MouseUp(object sender, MouseEventArgs e)
{
this.BackgroundImage = _normalImage;
}
#endregion
}