1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. //using System.Reflection;
  10.  
  11. namespace QLFUI
  12. {
  13. [DefaultEvent("Click")]
  14. public partial class Button : UserControl
  15. {
  16. #region 变量
  17.  
  18. //三种不同状态下的图片
  19. Image _normalImage = null;
  20. Image _moveImage = null;
  21. Image _downImage = null;
  22.  
  23. #endregion
  24. #region 属性
  25. /// <summary>
  26. /// 控件正常状态下显示的图片和Text
  27. /// </summary>
  28.  
  29. [Category("QLFSkinDll")]
  30. public Image NormalImage
  31. {
  32. get
  33. {
  34. return _normalImage;
  35. }
  36. set
  37. {
  38. _normalImage = value;
  39. }
  40. }
  41. [Category("QLFSkinDll")]
  42. public Image DownImage
  43. {
  44. get{ return _downImage; }
  45. set
  46. {
  47. _downImage = value;
  48. }
  49. }
  50.  
  51. [Category("QLFSkinDll")]
  52. public Image MoveImage
  53. {
  54. get{ return _moveImage; }
  55. set
  56. {
  57. _moveImage = value;
  58. }
  59. }
  60. [Category("QLFSkinDll")]
  61. public string Caption
  62. {
  63. get{ return this.button1.Text;} //控件运行时会自动运行get方法得到值
  64. set
  65. {
  66. this.button1.Text = value;
  67. }
  68. }
  69.  
  70. #endregion
  71.  
  72. #region 构造函数
  73. public Button()
  74. {
  75. // InitializeComponent();
  76. this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
  77. //默认的是自带的图片样式,如果使用该按钮则必须手工指定当前按钮你想要的背景图片
  78. _normalImage = Image.FromStream(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(@"QLFUI.3.jpg"));
  79. //_moveImage = Image.FromStream(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(@"QLFUI.btnfore.jpg"));
  80. // _downImage = Image.FromStream(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(@"QLFUI.btndown.jpg"));
  81. MakeTransparent(_normalImage);
  82. // MakeTransparent(_moveImage);
  83. // MakeTransparent(_downImage);
  84. InitializeComponent();
  85. this.BackgroundImage = null;
  86. //button1.BackgroundImage = _normalImage;
  87. //this.BackgroundImage = _normalImage;
  88. }
  89. #endregion
  90.  
  91. #region 辅助函数透明处理
  92. private void MakeTransparent(Image image)
  93. {
  94. Bitmap bitmap = image as Bitmap;
  95. bitmap.MakeTransparent(Color.FromArgb(,,));
  96. }
  97. #endregion
  98.  
  99. #region 事件
  100.  
  101. private void button1_MouseEnter(object sender, EventArgs e)
  102. {
  103. button1.BackgroundImage = _normalImage;
  104. //this.BackgroundImage = _moveImage;
  105. }
  106.  
  107. //private void button1_MouseDown(object sender, MouseEventArgs e)
  108. //{
  109. // button1.BackgroundImage = _downImage;
  110. // //this.BackgroundImage = _downImage;
  111. //}
  112.  
  113. private void button1_MouseLeave(object sender, EventArgs e)
  114. {
  115. button1.BackgroundImage = null;// _normalImage;
  116. // this.BackgroundImage = _normalImage;
  117. }
  118.  
  119. //private void button1_MouseUp(object sender, MouseEventArgs e)
  120. //{
  121. // button1.BackgroundImage = _normalImage;
  122. // //this.BackgroundImage = _normalImage;
  123. //}
  124.  
  125. private void button1_Click(object sender, EventArgs e)
  126. {
  127. this.OnClick(e);
  128. }
  129.  
  130. #endregion
  131.  
  132. }
  133. }

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

C#皮肤制作的更多相关文章

  1. C#窗口皮肤制作(二):创建窗口库项目以及最小化、最大化、关闭button的实现

    非常高兴有朋友关注这篇博客,同一时候也十分抱歉让关注的朋友久等了,隔上一篇博客也有3个月没有更新,主要是因为3月份辞职,4月份初离职到期离开了北京高德,来到了上海张江.眼下新工作也处于熟悉其中,希望大 ...

  2. DNN学习笔记 最简单的皮肤制作

    说明: 在学习DNN时,使用的版本为 DNN8.参考资料:http://www.dnnsoftware.com/docs/designers/creating-themes/index.html 制作 ...

  3. 【汇总】 为园友写的皮肤制作工具 awescnb

    Awescnb, awesome cnblog. 简介 可能许多初来乍到的新手会被博客园经典的风格劝退,或者您是一个老园友,需要为您的博客定制一些功能(例如宣传公众号,文章目录.或者插入几个捐助二维码 ...

  4. Sencha Extjs4.2 皮肤制作

    1                 UI组件基础 学习ExtJs就是学习组件的使用.ExtJs4对框架进行了重构,其中最重要的就是形成了一个结构及层次分明的组件体系,由这些组件形成了Ext的控件. E ...

  5. C#制作高仿360安全卫士窗体<一>

    开始写这一系列博客之前先要向大家说声抱歉,放肆雷特建立很久却很少有更新.当然博客人气也不旺,大部分都是看的人多评论收藏的人少.一直想要改变这种状态,正好赶上了最近工作上做了一个高仿360安全卫士窗体. ...

  6. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程07:UI》

    概述: UI即User Interface(用户界面)的简称.UI设计是指对软件的燃机交互.操作逻辑.界面美观的整体设计.好的UI设计不仅可以让游戏变得更有品位,更吸引玩家,还能充分体现开发者对游戏整 ...

  7. c++界面设计皮肤工具

    1. 先进行软件界面设计,确定软件界面美术包装方案 2. 依据软件界面美术设计装方案制作对应的图片,图片格式请參见AUDK的帮助文档或皮肤工具SkinTool 的 Demo 3. 打开皮肤工具 Ski ...

  8. MFC 使用Skin++ 美化皮肤

    查了好几天关于MFC应用程序换肤的资料,经过各种莫名其妙的问题的困扰,现分享一下自己的体会.希望可 以避免一些弯路.另外会在附上一些资源. 环境:Windows 7 + VS2012 + SkinSh ...

  9. Java 开源博客 Solo 1.9.0 发布 - 新皮肤

    这个版本主要是改进了评论模版机制,让大家更方便皮肤制作,并发布了一款新皮肤:9IPHP. Solo 是一款一个命令就能搭建好的 Java 开源博客系统,并内置了 15+ 套精心制作的皮肤.除此之外,S ...

随机推荐

  1. FineUI小技巧(4)关闭窗体那些事

    前言 FineUI中的Window控件常用作选择.新增或编辑内容.而关闭Window控件却有很多技巧,了解这些技巧有助于项目的快速开发. 如何关闭Window控件 第一个问题就是如何关闭Window控 ...

  2. lecture9-提高模型泛化能力的方法

    HInton第9课,这节课没有放论文进去.....如有不对之处还望指正.话说hinton的课果然信息量够大.推荐认真看PRML<Pattern Recognition and Machine L ...

  3. EF分页中的陷阱

    (一) 前言                                                                   EF使用非常简单,但是如果使用不当就会误入EF陷阱中. ...

  4. C语言文件的读写

    对文件的读和写是最常用的文件操作.在C语言中提供了多种文件读写的函数: 字符读写函数  :fgetc和fputc 字符串读写函数:fgets和fputs 数据块读写函数:freed和fwrite 格式 ...

  5. 13-mv 命令总结

  6. Java--笔记(5)

    41.面向对象的五大基本原则 (1)单一职责原则(SRP) (2)开放封闭原则(OCP) (3)里氏替换原则(LSP) (4)依赖倒置原则(DIP) (5)接口隔离原则(ISP) 单一职责原则(SRP ...

  7. android中的屏幕单位介绍

    1.px (pixels)(像素):是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px 会比较多.通常不推荐使用这个. 2.dip 或dp(与密度无关的像素):一个基于density(密度)的 ...

  8. [转]Filter实现处理中文乱码,转义html标签,过滤敏感词

    原文地址:http://www.cnblogs.com/xdp-gacl/p/3952405.html 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可 ...

  9. 【SPOJ 8222】Substrings

    http://www.spoj.com/problems/NSUBSTR/ clj课件里的例题 用结构体+指针写完模板后发现要访问所有的节点,改成数组会更方便些..于是改成了数组... 这道题重点是求 ...

  10. 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数

    本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...