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

 

距上篇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
3 [Category("放肆雷特扩展属性"), Description("输入最大字符数")]
4 public int MaxLength
5 {
6 get { return BaseText.MaxLength; }
7 set { BaseText.MaxLength = value; }
8
9 }
10
11 [Category("放肆雷特扩展属性"), Description("与控件关联的文本")]
12 public new string Text
13 {
14 get
15 {
16 return BaseText.Text;
17 }
18 set
19 {
20 BaseText.Text = value;
21 }
22 }
23
24 [Category("放肆雷特扩展属性"), Description("将控件设为密码显示")]
25 public bool IsPass
26 {
27 get
28 {
29 return BaseText.UseSystemPasswordChar;
30 }
31 set
32 {
33 BaseText.UseSystemPasswordChar = value;
34 }
35 }
36
37 [Category("放肆雷特扩展属性"), Description("密码显示字符")]
38 public char PassChar
39 {
40 get
41 {
42 return BaseText.PasswordChar;
43 }
44 set
45 {
46 BaseText.PasswordChar = value;
47 }
48 }
49
50 [Category("放肆雷特扩展属性"), Description("将控件设为多行文本显示")]
51 public bool Multiline
52 {
53 get
54 {
55 return BaseText.Multiline;
56 }
57 set
58 {
59 BaseText.Multiline = value;
60 if (value)
61 {
62 BaseText.Height = this.Height - 6;
63 }
64 else
65 {
66 base.Height = 22;
67 BaseText.Height = 16;
68 this.Invalidate();
69 }
70
71 }
72 }
73
74 [Category("放肆雷特扩展属性"), Description("设置控件中文本字体")]
75 public Font font
76 {
77 get
78 {
79 return BaseText.Font;
80 }
81 set
82 {
83 BaseText.Font = value;
84 }
85 }
86
87 [Category("放肆雷特扩展属性"), Description("将控件设为只读")]
88 public bool ReadOnly
89 {
90 get
91 {
92 return BaseText.ReadOnly;
93 }
94 set
95 {
96 BaseText.ReadOnly = value;
97 }
98 }
99
100 [Category("放肆雷特扩展属性"), Description("多行文本的编辑行")]
101 public String[] lines
102 {
103 get
104 {
105 return BaseText.Lines;
106 }
107 set
108 {
109 BaseText.Lines = value;
110 }
111 }
112
113 [Category("放肆雷特扩展属性"), Description("是否显示图标")]
114 public bool Isico
115 {
116 get
117 {
118 return _Isico;
119 }
120 set
121 {
122 _Isico = value;
123 if (value)
124 {
125 if (_Ico != null)
126 {
127 BaseText.Location = new Point(_IcoPadding.Left + _Ico.Width, 3);
128 BaseText.Width = BaseText.Width - _IcoPadding.Left - _Ico.Width;
129 }
130 else
131 {
132 BaseText.Location = new Point(25, 3);
133 BaseText.Width = BaseText.Width - 25;
134 }
135 }
136 this.Invalidate();
137 }
138 }
139
140 [Category("放肆雷特扩展属性"), Description("图标文件")]
141 public Bitmap Ico
142 {
143 get
144 {
145 return _Ico;
146 }
147 set
148 {
149 _Ico = value;
150 }
151 }
152
153 [Category("放肆雷特扩展属性"), Description("控件内部间距,图标文件")]
154 public Padding IcoPadding
155 {
156 get { return _IcoPadding; }
157 set
158 {
159 _IcoPadding = value;
160 this.Invalidate();
161 }
162 }
163 #endregion

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
17 private void TextBoxEx_Resize(object sender, EventArgs e)
18 {
19 if (this.Height > 22)
20 {
21 Multiline = true;
22 }
23 else
24 {
25 this.Height = 22;
26 Multiline = false;
27 }
28 }
29
30 private void NotifyIcoOnclick()
31 {
32 if (IcoOnclick != null)
33 {
34 IcoOnclick(this, EventArgs.Empty);
35 }
36 }
37
38 public void AppendText(string ss)
39 {
40 BaseText.AppendText(ss);
41 }
42
43 private void BaseText_MouseEnter(object sender, EventArgs e)
44 {
45 state = State.MouseOver;
46 this.Invalidate();
47 }
48
49 private void BaseText_MouseLeave(object sender, EventArgs e)
50 {
51 state = State.Normal;
52 this.Invalidate();
53 }
54
55 private void TextBoxEx_MouseUp(object sender, MouseEventArgs e)
56 {
57 if (_Ico != null)
58 {
59 if (new Rectangle(_IcoPadding.Left, _IcoPadding.Top, _Ico.Width, _Ico.Height).Contains(e.X, e.Y))
60 {
61 NotifyIcoOnclick();
62 }
63 }
64 }
65
66 private void TextBoxEx_MouseEnter(object sender, EventArgs e)
67 {
68 state = State.MouseOver;
69 this.Invalidate();
70 }
71
72 private void TextBoxEx_MouseLeave(object sender, EventArgs e)
73 {
74 state = State.Normal;
75 this.Invalidate();
76 }
77 #endregion

OK,写完收工…这个控件功力强大,使用简单很符合中国程序猿的使用习惯直接从工具栏拖放即可..如果还有不懂的欢迎进行留言。下一篇就开始讲360安全卫士最上面一排的水晶按钮的制作敬请期待喔。。

C#制作高仿360安全卫士窗体3的更多相关文章

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

    继上次C#制作高仿360安全卫士窗体<一>发布之后响应还不错,我的博客放肆雷特也来了不少的新朋友,在这里先谢谢大家的支持!我自己也反复看了一下觉得对不起大家,写的非常乱而且很少文字介绍.在 ...

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

    项目越来越紧,我也乐此不疲.自从上次C#制作高仿360安全卫士窗体(三)出来之后,就开始有一些人在说为什么还在坚持写这么落后的东西.我想说的是,我是从事企业信息化工作的,所有程序都只对内部使用.所以只 ...

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

    距上篇C#制作高仿360安全卫士窗体(二)也将近一个多月了,这个月事情还是像往常一样的多.不多我也乐在其中,毕竟我做的是我喜欢做的东西.今天特地抽空把怎么制作文本框写一下.同时也希望有爱好这些玩意的同 ...

  4. C#制作高仿360安全卫士窗体2

    C#制作高仿360安全卫士窗体 继上次C#制作高仿360安全卫士窗体<一>发布之后响应还不错,我的博客放肆雷特也来了不少的新朋友,在这里先谢谢大家的支持!我自己也反复看了一下觉得对不起大家 ...

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

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

  6. 高仿360界面的实现(用纯XML和脚本实现)

    源码下载:360UI 本项目XML的桌面渲染依赖GQT开源项目(请感兴趣的朋友加入QQ讨论群:101189702,在群共享文件里下载GQT源码),以下是360界面实现的全部XML代码,所有的代码都在3 ...

  7. C# WPF仿360安全卫士11

    首先上效果图: 这是我的第一篇随笔,最近因为写一个播放器,开始学习WPF相关技术,随着不断入坑,播放器倒是做出来了,掉坑里了... 本着闲着也是闲着的精神,拿360开刀了: 主界面主要使用DMSkin ...

  8. (原创)高仿360云盘android端的UI实现

    前些日子几大互联网巨头展开了一轮网盘空间大战.一下子从G级别提高到了T级别.以后谁的空间没有1T估计都不好意思开口了~~~ 试用了一下360云盘的客户端,比较小清新(不是给360打广告~~~).刚好U ...

  9. 制作高仿QQ的聊天系统(上)—— 布局文件 & 减少过度绘制

    由于没有自己的服务器,我就找了个能实现双方通信的SDK,这个SDK是友盟的用户反馈SDK.本系列的博文关注的不是网络通信,而是如何在网络通信机制已经做好的情况下,做出一个可用的聊天系统.其实,刚开始做 ...

随机推荐

  1. python_基础学习_03_正则替换文本(re.sub)

    python的正则表达式模块是re,替换相关的方法是sub. 例如我们要做如下的替换将所有的 替换为空格,可以通过下面代码实现: import re input = 'hello world' #第一 ...

  2. Sicily 1732 Alice and Bob (二进制最大公约数)

    联系: http://soj.me/1732 Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description: Alice is a b ...

  3. java_ java多线程返回函数结果

    两种方式:一种继承Thread类实现:一种通过实现Callable接口. 第一种方法: 因为实现Thread类的run方法自身是没有返回值的,所以不能直接获得线程的执行结果,但是可以通过在run方法里 ...

  4. 【百度地图API】如何区分地址解析和智能搜索?

    原文:[百度地图API]如何区分地址解析和智能搜索? 摘要: 很多用户一直无法区分地址解析geocoder和智能搜索localsearch的使用场景.该文章用一个详尽的示例,充分展示了这两个类,共5种 ...

  5. 深入理解C指针之二:C内存管理

    原文:深入理解C指针之二:C内存管理 内存管理对所有程序来说都很重要.有时候内存由运行时系统隐式的管理,比如为变量自动分配内存.在这种情况下,变量分配在它所处的函数的栈帧上(每个函数都有它自己的栈帧, ...

  6. 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】

    原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在h ...

  7. BS导出csv文件的通用方法(.net)

    最近把以前项目里用的导出文件的功能提取成了dll,通过读取Attribute来得到要导出的表头(没有支持多语言),使用时只要组织好要导出的数据,调用方法就好了,希望对大家有用. 使用时只需引用下载包里 ...

  8. SQL点滴12—SQL Server备份还原数据库中的小把戏

    原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support  1 media families, ...

  9. PDF解决方案(2)--文件转PDF

    相关专题链接: PDF解决方案(1)--文件上传 PDF解决方案(2)--文件转PDF PDF解决方案(3)--PDF转SWF PDF解决方案(4)--在线浏览 前言:上一篇中讲到的文件上传,文件上传 ...

  10. Java集合之ArrayList源码分析

    1.简介 List在数据结构中表现为是线性表的方式,其元素以线性方式存储,集合中允许存放重复的对象,List接口主要的实现类有ArrayList和LinkedList.Java中分别提供了这两种结构的 ...