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(255,0,255)); } #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。具体的事件里面执行的代码也很简单,就是更换按钮的背景图片