http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 17583|回复: 11

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

[复制链接]
发表于 2013-9-11 16:39:50 | 显示全部楼层 |阅读模式
本帖最后由 kovin 于 2013-9-11 16:43 编辑

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

这个文本框实现了多行以及鼠标进入移出等事件的效果,那么开发这个素材只有一个也是从之前360皮肤包里面提取出来进行修改的:

一、嵌入资源

将以上素材另存为,在解决方案中Images目录里面建立一个TextBoxImages文件夹,将图片素材拷贝进去,并设置图片属性中生成操作选择为“嵌入的资源”。


二、添加控件

资源嵌入之后再在ControlEx目录中建立一个TextBoxEx文件夹,在该文件夹下创建一个名为TextBoxEx的用户控件。该用户控件是用来实现皮肤变化,而真正的TextBox需要再从工具栏中拖一个到用户控件中。调整用户控件的宽高为为160*22,TextBox的宽高为154*16,TextBox的Margin属性为3,3,3,3,TextBox的BorderStyle属性值为None,将属性都调整完毕之后就可以开始进行代码的处理了。



三、编码
该控件的主要处理方法都比较简单,主要思路是重写TextBox的状态,然后再在用户控件上根据状态绘制不同的样式。
1、变量声明

  1. #region 声明
  2. private Bitmap _TextBoxBackImg = ImageObject.GetResBitmap("FANGSI.UI.Images.TextBoxImages.Textbox.png");
  3. private State state = State.Normal;
  4. private bool _Isico = false;
  5. private Bitmap _Ico;
  6. private Padding _IcoPadding = new Padding(3, 3, 0, 0);
  7. //枚鼠标状态
  8. private enum State
  9. {
  10.     Normal = 1,
  11.     MouseOver = 2,
  12.     MouseDown = 3,
  13.     Disable = 4,
  14.     Default = 5
  15. }
  16. #endregion
复制代码
2、构造参数处理,初始化控件的属性
  1. #region 构造
  2. public TextBoxEx()
  3. {
  4.     InitializeComponent();
  5.     this.SetStyle(ControlStyles.UserPaint, true);
  6.     this.SetStyle(ControlStyles.DoubleBuffer, true);
  7.     this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
  8.     this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
  9.     this.SetStyle(ControlStyles.StandardDoubleClick, false);
  10.     this.SetStyle(ControlStyles.Selectable, true);
  11.     this.BackColor = Color.Transparent;
  12. }
  13. #endregion
复制代码
3、属性定义,其中可以加入自己想要功能的特殊字段再根据自己的需要进行处理
  1. #region 属性

  2. [Category("放肆雷特扩展属性"), Description("输入最大字符数")]
  3. public int MaxLength
  4. {
  5.     get { return BaseText.MaxLength; }
  6.     set { BaseText.MaxLength = value; }

  7. }

  8. [Category("放肆雷特扩展属性"), Description("与控件关联的文本")]
  9. public new string Text
  10. {
  11.     get
  12.     {
  13.         return BaseText.Text;
  14.     }
  15.     set
  16.     {
  17.         BaseText.Text = value;
  18.     }
  19. }

  20. [Category("放肆雷特扩展属性"), Description("将控件设为密码显示")]
  21. public bool IsPass
  22. {
  23.     get
  24.     {
  25.         return BaseText.UseSystemPasswordChar;
  26.     }
  27.     set
  28.     {
  29.         BaseText.UseSystemPasswordChar = value;
  30.     }
  31. }

  32. [Category("放肆雷特扩展属性"), Description("密码显示字符")]
  33. public char PassChar
  34. {
  35.     get
  36.     {
  37.         return BaseText.PasswordChar;
  38.     }
  39.     set
  40.     {
  41.         BaseText.PasswordChar = value;
  42.     }
  43. }

  44. [Category("放肆雷特扩展属性"), Description("将控件设为多行文本显示")]
  45. public bool Multiline
  46. {
  47.     get
  48.     {
  49.         return BaseText.Multiline;
  50.     }
  51.     set
  52.     {
  53.         BaseText.Multiline = value;
  54.         if (value)
  55.         {
  56.             BaseText.Height = this.Height - 6;
  57.         }
  58.         else
  59.         {
  60.             base.Height = 22;
  61.             BaseText.Height = 16;
  62.             this.Invalidate();
  63.         }

  64.     }
  65. }

  66. [Category("放肆雷特扩展属性"), Description("设置控件中文本字体")]
  67. public Font font
  68. {
  69.     get
  70.     {
  71.         return BaseText.Font;
  72.     }
  73.     set
  74.     {
  75.         BaseText.Font = value;
  76.     }
  77. }

  78. [Category("放肆雷特扩展属性"), Description("将控件设为只读")]
  79. public bool ReadOnly
  80. {
  81.     get
  82.     {
  83.         return BaseText.ReadOnly;
  84.     }
  85.     set
  86.     {
  87.         BaseText.ReadOnly = value;
  88.     }
  89. }

  90. [Category("放肆雷特扩展属性"), Description("多行文本的编辑行")]
  91. public String[] lines
  92. {
  93.     get
  94.     {
  95.         return BaseText.Lines;
  96.     }
  97.     set
  98.     {
  99.         BaseText.Lines = value;
  100.     }
  101. }

  102. [Category("放肆雷特扩展属性"), Description("是否显示图标")]
  103. public bool Isico
  104. {
  105.     get
  106.     {
  107.         return _Isico;
  108.     }
  109.     set
  110.     {
  111.         _Isico = value;
  112.         if (value)
  113.         {
  114.             if (_Ico != null)
  115.             {
  116.                 BaseText.Location = new Point(_IcoPadding.Left + _Ico.Width, 3);
  117.                 BaseText.Width = BaseText.Width - _IcoPadding.Left - _Ico.Width;
  118.             }
  119.             else
  120.             {
  121.                 BaseText.Location = new Point(25, 3);
  122.                 BaseText.Width = BaseText.Width - 25;
  123.             }
  124.         }
  125.         this.Invalidate();
  126.     }
  127. }

  128. [Category("放肆雷特扩展属性"), Description("图标文件")]
  129. public Bitmap Ico
  130. {
  131.     get
  132.     {
  133.         return _Ico;
  134.     }
  135.     set
  136.     {
  137.         _Ico = value;
  138.     }
  139. }

  140. [Category("放肆雷特扩展属性"), Description("控件内部间距,图标文件")]
  141. public Padding IcoPadding
  142. {
  143.     get { return _IcoPadding; }
  144.     set
  145.     {
  146.         _IcoPadding = value;
  147.         this.Invalidate();
  148.     }
  149. }
  150. #endregion
复制代码

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





1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2013-9-13 09:02:50 | 显示全部楼层
站长苏飞 发表于 2013-9-12 09:25
http://www.sufeinet.com/thread-655-1-1.html
http://www.sufeinet.com/thread-2-1-1.html
就是类似于我 ...

哦,这样的。那等我这些都写出来之后再整理一个吧。
 楼主| 发表于 2013-9-11 16:47:05 | 显示全部楼层
4、委托,委托图标点击事件
  1. #region 委托
  2. public event EventHandler IcoOnclick;
  3. #endregion
复制代码
5、方法处理
  1. #region 方法
  2. protected override void OnPaint(PaintEventArgs e)
  3. {
  4.     Rectangle rc = this.ClientRectangle;
  5.     Graphics g = e.Graphics;
  6.     ImageDrawRect.DrawRect(g, _TextBoxBackImg, rc, Rectangle.FromLTRB(10, 10, 10, 10), (int)state, 5);
  7.     if (_Isico)
  8.     {
  9.         if (_Ico != null)
  10.         {
  11.             g.DrawImage(_Ico, new Point(_IcoPadding.Left, _IcoPadding.Top));
  12.         }
  13.     }
  14.     base.OnPaint(e);
  15. }

  16. private void TextBoxEx_Resize(object sender, EventArgs e)
  17. {
  18.     if (this.Height > 22)
  19.     {
  20.         Multiline = true;
  21.     }
  22.     else
  23.     {
  24.         this.Height = 22;
  25.         Multiline = false;
  26.     }
  27. }

  28. private void NotifyIcoOnclick()
  29. {
  30.     if (IcoOnclick != null)
  31.     {
  32.         IcoOnclick(this, EventArgs.Empty);
  33.     }
  34. }

  35. public void AppendText(string ss)
  36. {
  37.     BaseText.AppendText(ss);
  38. }

  39. private void BaseText_MouseEnter(object sender, EventArgs e)
  40. {
  41.     state = State.MouseOver;
  42.     this.Invalidate();
  43. }

  44. private void BaseText_MouseLeave(object sender, EventArgs e)
  45. {
  46.     state = State.Normal;
  47.     this.Invalidate();
  48. }

  49. private void TextBoxEx_MouseUp(object sender, MouseEventArgs e)
  50. {
  51.     if (_Ico != null)
  52.     {
  53.         if (new Rectangle(_IcoPadding.Left, _IcoPadding.Top, _Ico.Width, _Ico.Height).Contains(e.X, e.Y))
  54.         {
  55.             NotifyIcoOnclick();
  56.         }
  57.     }
  58. }

  59. private void TextBoxEx_MouseEnter(object sender, EventArgs e)
  60. {
  61.     state = State.MouseOver;
  62.     this.Invalidate();
  63. }

  64. private void TextBoxEx_MouseLeave(object sender, EventArgs e)
  65. {
  66.     state = State.Normal;
  67.     this.Invalidate();
  68. }
  69. #endregion
复制代码
OK,写完收工…这个控件功力强大,使用简单很符合中国程序猿的使用习惯直接从工具栏拖放即可..如果还有不懂的欢迎进行留言。下一篇就开始讲360安全卫士最上面一排的水晶按钮的制作敬请期待喔。。

本文来自 放肆雷特 | 胖子的技术博客
发表于 2013-9-11 16:49:40 | 显示全部楼层
还在坚持写啊,我的都不写了,有时间写一套新的算法,使用Gdi+技术太落后了,而且属性没办法解决
 楼主| 发表于 2013-9-11 16:56:44 | 显示全部楼层
站长苏飞 发表于 2013-9-11 16:49
还在坚持写啊,我的都不写了,有时间写一套新的算法,使用Gdi+技术太落后了,而且属性没办法解决

这个做了有一段时间了,一直在项目上面用,还是能满足需求。所以就把它写出来。是比较落后,只是分享一种思路吧。像我们企业内部应用的话,不需要比较先进的技术。有时间是得写一写新的。{:soso_e113:}
发表于 2013-9-11 17:00:53 | 显示全部楼层
有什么好的解决方案没有,或者是想法,我的皮肤现在都不更新了。因为技术上有瓶颈
 楼主| 发表于 2013-9-11 17:09:34 | 显示全部楼层
站长苏飞 发表于 2013-9-11 17:00
有什么好的解决方案没有,或者是想法,我的皮肤现在都不更新了。因为技术上有瓶颈

用.Net写效率上面是硬伤,我看了其它的一些皮肤也都是用GDI+。应用深入的话就比较卡了,效率不高。所以现在也没有去研究。可能WPF这些会比较好吧。
发表于 2013-9-11 17:34:57 | 显示全部楼层
WPF性能也是个麻烦,现在好些的估计就是Sl了。不过成本太高了。用的人也不会太多。等吧,呵呵。不过学习也够了。让大家熟悉下这方面知识是没问题的。坚持写完吧。可以在我这边开个专题。把这方面方法给做个导航统一一下
 楼主| 发表于 2013-9-12 09:04:19 | 显示全部楼层
站长苏飞 发表于 2013-9-11 17:34
WPF性能也是个麻烦,现在好些的估计就是Sl了。不过成本太高了。用的人也不会太多。等吧,呵呵。不过学习也 ...

嗯。我平常也对这些比较感兴趣。我这个还写几篇就完了,到时候再把源码放上来就可以了。专题那些我不知道怎么整。{:soso_e113:}
发表于 2013-9-12 09:25:05 | 显示全部楼层
http://www.sufeinet.com/thread-655-1-1.html
http://www.sufeinet.com/thread-2-1-1.html
就是类似于我这种的。
其实就是做一个好点的导读帖子
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-16 01:55

© 2014-2021

快速回复 返回顶部 返回列表