昨天,在 钱李峰的博客 中看了有关按钮皮肤美化的文章。并跟着钱李峰大大的思路做了一遍,发现这个方法比我以前(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 }
|
请发表评论