Loading

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

项目越来越紧,我也乐此不疲。自从上次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高仿安全卫士系列文章已经基本完了。没有写什么,就主要记录一下自己的开发历程。过几天整理源码上传上来,给大家下载使用。


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

posted @ 2013-10-18 14:09  Kovin  阅读(5252)  评论(11编辑  收藏  举报