using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//using System.Reflection; namespace QLFUI
{
[DefaultEvent("Click")]
public partial class Button : UserControl
{
#region 变量 //三种不同状态下的图片
Image _normalImage = null;
Image _moveImage = null;
Image _downImage = null; #endregion
#region 属性
/// <summary>
/// 控件正常状态下显示的图片和Text
/// </summary> [Category("QLFSkinDll")]
public Image NormalImage
{
get
{
return _normalImage;
}
set
{
_normalImage = value;
}
}
[Category("QLFSkinDll")]
public Image DownImage
{
get{ return _downImage; }
set
{
_downImage = value;
}
} [Category("QLFSkinDll")]
public Image MoveImage
{
get{ return _moveImage; }
set
{
_moveImage = value;
}
}
[Category("QLFSkinDll")]
public string Caption
{
get{ return this.button1.Text;} //控件运行时会自动运行get方法得到值
set
{
this.button1.Text = value;
}
} #endregion #region 构造函数
public Button()
{
// InitializeComponent();
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
//默认的是自带的图片样式,如果使用该按钮则必须手工指定当前按钮你想要的背景图片
_normalImage = Image.FromStream(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(@"QLFUI.3.jpg"));
//_moveImage = Image.FromStream(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(@"QLFUI.btnfore.jpg"));
// _downImage = Image.FromStream(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(@"QLFUI.btndown.jpg"));
MakeTransparent(_normalImage);
// MakeTransparent(_moveImage);
// MakeTransparent(_downImage);
InitializeComponent();
this.BackgroundImage = null;
//button1.BackgroundImage = _normalImage;
//this.BackgroundImage = _normalImage;
}
#endregion #region 辅助函数透明处理
private void MakeTransparent(Image image)
{
Bitmap bitmap = image as Bitmap;
bitmap.MakeTransparent(Color.FromArgb(,,));
}
#endregion #region 事件 private void button1_MouseEnter(object sender, EventArgs e)
{
button1.BackgroundImage = _normalImage;
//this.BackgroundImage = _moveImage;
} //private void button1_MouseDown(object sender, MouseEventArgs e)
//{
// button1.BackgroundImage = _downImage;
// //this.BackgroundImage = _downImage;
//} private void button1_MouseLeave(object sender, EventArgs e)
{
button1.BackgroundImage = null;// _normalImage;
// this.BackgroundImage = _normalImage;
} //private void button1_MouseUp(object sender, MouseEventArgs e)
//{
// button1.BackgroundImage = _normalImage;
// //this.BackgroundImage = _normalImage;
//} private void button1_Click(object sender, EventArgs e)
{
this.OnClick(e);
} #endregion }
}
[DefaultEvent("Click")],这句话是什么意思呢?我们知道平常我们拖一个按钮后,在设计模式下双击这个按钮就会自动产生这个按钮的Click事件。这个默认的Click事件从哪里来的呢,毫无疑问就是[DefaultEvent("Click")]这一句来设置的啦!这里默认的是Click事件,如果写成[DefaultEvent("MouseEnter")]就是MouseEnter事件啦!
接下来的四句分别定义了按钮三种不同状态下的bitmap。
下面的四个属性分别是三种不同状态下Image的属性和按钮的文字属性Caption,大家一看应该就明白。具体要解释的就是[Category("QLFSkinDll")]。这句话的意思是将这些属性分类,看个图片大家就都明白了:以后在项目中设置属性时,我们定义的属性就自动分类在QLFSkinDll下面了。
接下来是构造函数:public Button(){}中的内容。
第一句是开始了窗体的双缓冲。双缓冲的意思就是现在内容中将图像画好了然后再显示到界面上去。在c#中图像一多最怕的就是图像闪烁的问题,开启了双缓冲虽说不能完全避免图像闪烁,但起码也能有一定的效果,我们就先开着吧^ ^!
接下来的三句就是给三个状态的图像赋值了,这里我是把图像嵌入进来了,并没有放置在外部。要应用嵌入的资源分两步走:第一步在项目中点击图片的属性,然后将“生成操作”改为嵌入的资源。
第二步应用就是我们用到的代码啦:Assembly.GetExecutingAssembly().GetManifestResourceStream(@"QLFUI.Res.button.btnnomal.bmp"),这句话前面的照写,后面的路径规则是“命名空间+文件夹名+你的文件名+文件名后缀”,当然如果你的文件直接放在项目下就没有文件夹名了。聪明的大家应该明白吧?呵呵!其中我们要用到的文件大家可以从我给的项目例子中复制。接下来的MakeTransparent(_normalImage);MakeTransparent(_moveImage);MakeTransparent(_downImage);三句先不看,可以注释掉,下面会讲解它的作用的。
第八句InitializeComponent()是系统自带的初始化控件一些代码,我们不用去管它。最后一句this.BackgroundImage =_normalImage;就是设置按钮的其实的图片的样子啦!
再来看第二个问题,要实现按钮的变色肯定是跟鼠标的事件相关啦,比如说鼠标一进入按钮的范围之内我们就让按钮的背景改变,按下和离开按钮的时候也响应的改变背景。所以我们用到这四个事件(注意,事件都是label1的事件,因为我们将label覆盖在按钮上,所以我们点击的其实是label1):MouseEnter,MouseDown, MouseLeave, MouseUp。具体的事件里面执行的代码也很简单,就是更换按钮的背景图片