C#制作高仿360安全卫士窗体(四)- 水晶按钮

原文http://www.cnblogs.com/kovin/archive/2013/10/18/3375977.html

项目越来越紧,我也乐此不疲。自从上次C#制作高仿360安全卫士窗体(三)出来之后,就开始有一些人在说为什么还在坚持写这么落后的东西。我想说的是,我是从事企业信息化工作的,所有程序都只对内部使用。所以只要能满足需求就可以,比较高端先进的技术也没有时间去学习研究。
OK继续上次的内容。上次说到制作文本框,今天要写的是怎么实现水晶按钮的制作。下面是效果图:

下面是这个按钮所需要的图片素材,该素材也提取自360安全卫士。我自己做了一点点小的修改(另存为图片就可以使用):

一、嵌入资源
将以上素材另存为,将图片保存在解决方案中Images目录下的ButtonImages文件夹中,并设置图片属性中生成操作选择为“嵌入的资源”。

二、添加控件
资源嵌入之后再在ControlEx目录中建立一个名为GlassButton的文件夹用来存放该控件的代码。再在该目录中建立一个名为GlassButton的用户控件
三、编码
和之前的控件一样,最开始先把该控件拥有的状态定义出来,这里我定义了四种状态:

 1     #region 控件状态
 2     /// <summary>
 3     /// 控件状态
 4     /// </summary>
 5     public enum State
 6     {
 7         /// <summary>
 8         /// 无
 9         /// </summary>
10         Normal = 0,
11         /// <summary>
12         /// 获得焦点
13         /// </summary>
14         Focused = 1,
15         /// <summary>
16         /// 失去焦点
17         /// </summary>
18         LostFocused = 2,
19         /// <summary>
20         /// 鼠标指针进入控件
21         /// </summary>
22         MouseEnter = 3
23     }
24     #endregion

下面是该控件的所有代码和之前基本一样:

  1 /// <summary>
  2 /// Toolbar控件
  3 /// </summary>
  4 public class GlassButton : Control
  5 {
  6     #region//私有变量
  7     private int bmp_Left;
  8     private const int bmp_Top = 6;
  9     private const int bmp_Size = 48;
 10     private bool _focused = false;
 11     private State state = State.Normal;
 12     public Bitmap _BackImg = ImageObject.GetResBitmap("FANGSI.UI.Images.ButtonImages.Toolbar_Hover.png");
 13
 14     private Bitmap _bmp = null;
 15     #endregion
 16
 17     #region//构造函数
 18     public GlassButton()
 19     {
 20         try
 21         {
 22             this.SetStyle(ControlStyles.DoubleBuffer, true);
 23             this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
 24             this.SetStyle(ControlStyles.UserPaint, true);
 25             this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
 26             this.SetStyle(ControlStyles.StandardDoubleClick, false);
 27             this.SetStyle(ControlStyles.Selectable, true);
 28             ResizeRedraw = true;
 29             BackColor = Color.Transparent;
 30             ForeColor = Color.White;//初始文本颜色
 31             Size = new Size(80, 75);//初始大小
 32             Font = new Font("微软雅黑", 9, System.Drawing.FontStyle.Bold);//控件字体
 33         }
 34         catch { }
 35     }
 36     #endregion
 37
 38     #region//属性
 39     /// <summary>
 40     /// 获取或设置控件显示的图片
 41     /// </summary>
 42     [CategoryAttribute("放肆雷特扩展属性"), Description("获取或设置控件显示的图标")]
 43     public Bitmap Bitmap
 44     {
 45         get { return _bmp; }
 46         set
 47         {
 48             _bmp = value;
 49             Invalidate(false);
 50         }
 51     }
 52
 53     /// <summary>
 54     /// 重写控件焦点属性
 55     /// </summary>
 56     [CategoryAttribute("放肆雷特扩展属性"), Description("重写控件焦点属性")]
 57     public new bool Focused
 58     {
 59         get { return _focused; }
 60         set
 61         {
 62             _focused = value;
 63
 64             if (_focused)
 65                 state = State.Focused;
 66             else
 67                 state = State.LostFocused;
 68
 69             Invalidate(false);
 70         }
 71     }
 72     #endregion
 73
 74     #region//重载事件
 75     //自定义绘制
 76     protected override void OnPaint(PaintEventArgs e)
 77     {
 78         base.OnPaint(e);
 79         Graphics g = e.Graphics;
 80         g.SmoothingMode = SmoothingMode.HighQuality;
 81         g.PixelOffsetMode = PixelOffsetMode.HighQuality;
 82
 83         switch (state)
 84         {
 85             case State.Focused:
 86                 {
 87                     DrawSelected(g);
 88                     break;
 89                 }
 90             case State.MouseEnter:
 91                 {
 92                     if (!Focused)
 93                         //g.DrawImage(Properties.Resources.enter, ClientRectangle);
 94                         ImageDrawRect.DrawRect(g, _BackImg, ClientRectangle, 1, 2);
 95                     else
 96                         DrawSelected(g);
 97                     break;
 98                 }
 99         }
100
101         DrawImage(g);
102         DrawText(g);
103     }
104
105     //焦点进入
106     protected override void OnEnter(EventArgs e)
107     {
108         base.OnEnter(e);
109         Focused = true;
110     }
111
112     //失去焦点
113     protected override void OnLeave(EventArgs e)
114     {
115         base.OnLeave(e);
116         Focused = false;
117     }
118
119     //禁止调整大小
120     protected override void OnResize(EventArgs e)
121     {
122         Width = 80;
123         Height = 75;
124     }
125
126     protected override void OnMouseEnter(EventArgs e)
127     {
128         base.OnMouseEnter(e);
129         state = State.MouseEnter;
130         Invalidate(false);
131     }
132
133     protected override void OnMouseLeave(EventArgs e)
134     {
135         base.OnMouseLeave(e);
136         if (!Focused)
137         {
138             state = State.LostFocused;
139             Invalidate(false);
140         }
141     }
142
143     //只响应单击鼠标左键事件
144     protected override void OnClick(EventArgs e)
145     {
146         MouseEventArgs m = (MouseEventArgs)e;
147         if (m.Button == MouseButtons.Left)
148         {
149             base.OnClick(e);
150             Focus();
151         }
152     }
153     #endregion
154
155     #region//方法
156
157     #region//Draw
158     void DrawSelected(Graphics g)
159     {
160         ImageDrawRect.DrawRect(g, _BackImg, ClientRectangle, 2, 2);
161     }
162
163     void DrawImage(Graphics g)
164     {
165         if (_bmp != null)
166         {
167             Bitmap bmp = ScaleZoom(_bmp);
168             bmp_Left = (Width - bmp.Width) / 2;
169             g.DrawImage(bmp, new Rectangle(bmp_Left, bmp_Top, bmp.Width, bmp.Height));
170         }
171     }
172
173     void DrawText(Graphics g)
174     {
175         SizeF size = g.MeasureString(Text, Font);
176         g.DrawString(Text, Font, new SolidBrush(ForeColor), (Width - size.Width) / 2, 55);
177     }
178     #endregion
179
180     #region//按比例缩放图片
181     public Bitmap ScaleZoom(Bitmap bmp)
182     {
183         if (bmp != null)
184         {
185             double zoomScale;
186             if (bmp.Width > bmp_Size || bmp.Height > bmp_Size)
187             {
188                 double imageScale = (double)bmp.Width / (double)bmp.Height;
189                 double thisScale = 1;
190
191                 if (imageScale > thisScale)
192                 {
193                     zoomScale = (double)bmp_Size / (double)bmp.Width;
194                     return BitMapZoom(bmp, bmp_Size, (int)(bmp.Height * zoomScale));
195                 }
196                 else
197                 {
198                     zoomScale = (double)bmp_Size / (double)bmp.Height;
199                     return BitMapZoom(bmp, (int)(bmp.Width * zoomScale), bmp_Size);
200                 }
201             }
202         }
203         return bmp;
204     }
205     #endregion
206
207     #region//缩放BitMap
208     /// <summary>
209     /// 图片缩放
210     /// </summary>
211     /// <param name="bmpSource">源图片</param>
212     /// <param name="bmpSize">缩放图片的大小</param>
213     /// <returns>缩放的图片</returns>
214     public Bitmap BitMapZoom(Bitmap bmpSource, int bmpWidth, int bmpHeight)
215     {
216         Bitmap bmp, zoomBmp;
217         try
218         {
219             bmp = new Bitmap(bmpSource);
220             zoomBmp = new Bitmap(bmpWidth, bmpHeight);
221             Graphics gh = Graphics.FromImage(zoomBmp);
222             gh.InterpolationMode = InterpolationMode.HighQualityBicubic;
223             gh.DrawImage(bmp, new Rectangle(0, 0, bmpWidth, bmpHeight), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
224
225             gh.Dispose();
226             return zoomBmp;
227         }
228         catch
229         { }
230         finally
231         {
232             bmp = null;
233             zoomBmp = null;
234             GC.Collect();
235         }
236         return null;
237     }
238     #endregion
239
240     #endregion
241 }

编译通过后即可在工具箱中使用,图标需要自己去找。至此360高仿安全卫士系列文章已经基本完了。没有写什么,就主要记录一下自己的开发历程。过几天整理源码上传上来,给大家下载使用。



本文来自 放肆雷特 | 胖子的技术博客

时间: 2024-09-29 02:34:44

C#制作高仿360安全卫士窗体(四)- 水晶按钮的相关文章

C#制作高仿360安全卫士窗体(三)

原文 http://www.cnblogs.com/kovin/archive/2013/09/11/3314858.html 距上篇C#制作高仿360安全卫士窗体(二)也 将近一个多月了,这个月事情还是像往常一样的多.不多我也乐在其中,毕竟我做的是我喜欢做的东西.今天特地抽空把怎么制作文本框写一下.同时也希望有爱好 这些玩意的同仁和我进行交流... 文本框的开发比起按钮开发还是有一点不同,因为我这里主要是给文本框做美化,所以不需要完完全全的进行自己开发.只是重写它的某些事件,然后展现不同的效

C#制作高仿360安全卫士窗体&lt;一&gt;

原文 http://www.cnblogs.com/kovin/p/3172234.html 开始写这一系列博客之前先要向大家说声抱歉,放肆雷特建立很久却很少有更新.当然博客人气也不旺,大部分都是看的人多评论收藏的人少.一直想要改变这种状态,正好赶上了最近工作上做了一个高仿360安全卫士窗体.所以将开发历程分享出来,一来希望能和大家交流共同学习成长:二来希望自己的放肆雷特能有人光顾. 这一系列的文章所用到的技术首先要感谢苏飞大哥,我也是在很早以前看了他的QQ皮肤制作文章之后得到的灵感和一些相关知

360安全卫士领航版皮肤如何制作

360安全卫士领航版皮肤怎么制作?继2014年10月24日360安全卫士推出10.0beta后,推出了360安全卫士领航版,领航版中皮肤更是加入自定义功能,让用户选择自己喜欢的图片作为皮肤,下面pc软件下载站小编就为大家介绍一下领航版中个性化皮肤如何设定吧! 操作教程 例如,这个萌妹纸,如何把她变成皮肤呢? 1.怎么制作个性化皮肤呢,首先下载安装360安全卫士领航版: 2.点击右上角"皮肤"图标,选择"自定义"; 3.点击"自定义添加": 4.选

高仿QQMusic播放器,浅谈WinForm关于UI的制作

高仿QQMusic(2008)播放器,VS2008环境下开发,功能陆续开发中,上图先( 右边那个乐库没有啥内容,临时弄个网页放上去充数) 软件UI开发方法我正在整理中,尽量探索出既简单又功能强大的UI制作方法, 随后会发布方法与大家讨论的,最近比较忙...... [2月13日更新] 首先感谢园友对本随笔的关注!!!! 浅谈一下我关于此软件的UI的制作方法,我的文笔不好,说话可能有点罗嗦, 谅解哈! 要想做出好看的界面,素材准备是第一步,我因为超级喜欢QQMusic的界面, 萌发了仿造它的想法.本

360安全卫士领航版皮肤怎么制作?

操作教程 例如,这个萌妹纸,如何把她变成皮肤呢? 在11月18日-26日微博分享皮肤更有机会抢iPhone6.安仔玩偶.第二代360WiFi.360智键等奖品 1, 怎么制作个性化皮肤呢,首先下载安装360安全卫士领航版: 2, 点击右上角"皮肤"图标,选择"自定义"; 3, 点击"自定义添加": 4, 选择你喜欢的图片(注意,图片尺寸要大于900*440哟): 5, 拖拽卫士更改截取皮肤的位置,也可以拖拽背景图片更改截取皮肤的位置: 6, 使用

360安全卫士领航版皮肤怎么制作?

  1.怎么制作个性化皮肤呢,首先下载安装360安全卫士领航版: 2.点击右上角"皮肤"图标,选择"自定义"; 3.点击"自定义添加" 4.选择你喜欢的图片(注意,图片尺寸要大于900*440哟): 5.拖拽卫士更改截取皮肤的位置,也可以拖拽背景图片更改截取皮肤的位置: 6. 使用卫士旁边的工具条调节文字颜色(我们已经为背景图片预置了颜色了,如果不满意,可通过这个功能调节): 7.另外你还可以通过工具栏的"向左旋转".&quo

360安全卫士怎么制作个性化皮肤

  1.进入您的360安全卫士软件 2.点击右上角皮肤图标,选择自定义 3.点击自定义添加 4.选择你喜欢的图片(注意,图片尺寸要大于900*440) 5.拖拽卫士更改截取皮肤的位置,也可以拖拽背景图片更改截取皮肤的位置 6.使用卫士旁边的工具条调节文字颜色(我们已经为背景图片预置了颜色了,如果不满意,可通过这个功能调节) 7.另外你还可以通过工具栏的"向左旋转"."向右旋转"."放大图片"."缩小图片"来调节背景图,以制作自

傅盛口述360安全卫士历史:我不是林彪

傅盛为什么要离开360?是因为非作歹.蓄谋叛逃.恩将仇报,还是功高震主.迫不得已?当然,事情原貌肯定不会是单纯的一边倒.听听故事吧.请注意,这是一段傅盛口述的历史,信不信由你. (该文基于笔者与傅盛(微博)及其周围管理人员的三度面谈,所记叙事件均出自傅盛本人口述.) 傅盛以为:如果奇虎搜索能成功而不是360一枝独秀,自己当年不是年轻气盛而是老练事故,如果周鸿祎(微博)没用掏空雅虎的方法对付老东家,不是总把假想敌定义成他自己,傅周之间就不会一步步搞到现在这般水火不容 前360员工心里,周鸿祎和傅盛

360安全卫士vs贝壳木马专杀

"云安全"大家已经不再陌生,随着360安全卫士6.0.金山贝壳1.0的陆续面世,我们已经正式进入到"云安全"时代.那么这些被厂商吹得神乎其神的"云查杀",是否真能代替传统防病毒软件,相信下面这篇文章将带给您答案. 事实上对于"云安全"的定义,业界并无统一标准.一般来说国外厂商往往通过部署于"云端"(即互联网)的服务器群,对个人电脑进行进程认证,看上去更像是一种智能化的"白名单".而国内厂