C#皮肤制作

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

posted @ 2014-03-31 12:40  苦力劳动者  阅读(539)  评论(0编辑  收藏  举报