本帖最后由 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、变量声明 - #region 声明
- private Bitmap _TextBoxBackImg = ImageObject.GetResBitmap("FANGSI.UI.Images.TextBoxImages.Textbox.png");
- private State state = State.Normal;
- private bool _Isico = false;
- private Bitmap _Ico;
- private Padding _IcoPadding = new Padding(3, 3, 0, 0);
- //枚鼠标状态
- private enum State
- {
- Normal = 1,
- MouseOver = 2,
- MouseDown = 3,
- Disable = 4,
- Default = 5
- }
- #endregion
复制代码 2、构造参数处理,初始化控件的属性
- #region 构造
- public TextBoxEx()
- {
- InitializeComponent();
- this.SetStyle(ControlStyles.UserPaint, true);
- this.SetStyle(ControlStyles.DoubleBuffer, true);
- this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
- this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
- this.SetStyle(ControlStyles.StandardDoubleClick, false);
- this.SetStyle(ControlStyles.Selectable, true);
- this.BackColor = Color.Transparent;
- }
- #endregion
复制代码 3、属性定义,其中可以加入自己想要功能的特殊字段再根据自己的需要进行处理- #region 属性
- [Category("放肆雷特扩展属性"), Description("输入最大字符数")]
- public int MaxLength
- {
- get { return BaseText.MaxLength; }
- set { BaseText.MaxLength = value; }
- }
- [Category("放肆雷特扩展属性"), Description("与控件关联的文本")]
- public new string Text
- {
- get
- {
- return BaseText.Text;
- }
- set
- {
- BaseText.Text = value;
- }
- }
- [Category("放肆雷特扩展属性"), Description("将控件设为密码显示")]
- public bool IsPass
- {
- get
- {
- return BaseText.UseSystemPasswordChar;
- }
- set
- {
- BaseText.UseSystemPasswordChar = value;
- }
- }
- [Category("放肆雷特扩展属性"), Description("密码显示字符")]
- public char PassChar
- {
- get
- {
- return BaseText.PasswordChar;
- }
- set
- {
- BaseText.PasswordChar = value;
- }
- }
- [Category("放肆雷特扩展属性"), Description("将控件设为多行文本显示")]
- public bool Multiline
- {
- get
- {
- return BaseText.Multiline;
- }
- set
- {
- BaseText.Multiline = value;
- if (value)
- {
- BaseText.Height = this.Height - 6;
- }
- else
- {
- base.Height = 22;
- BaseText.Height = 16;
- this.Invalidate();
- }
- }
- }
- [Category("放肆雷特扩展属性"), Description("设置控件中文本字体")]
- public Font font
- {
- get
- {
- return BaseText.Font;
- }
- set
- {
- BaseText.Font = value;
- }
- }
- [Category("放肆雷特扩展属性"), Description("将控件设为只读")]
- public bool ReadOnly
- {
- get
- {
- return BaseText.ReadOnly;
- }
- set
- {
- BaseText.ReadOnly = value;
- }
- }
- [Category("放肆雷特扩展属性"), Description("多行文本的编辑行")]
- public String[] lines
- {
- get
- {
- return BaseText.Lines;
- }
- set
- {
- BaseText.Lines = value;
- }
- }
- [Category("放肆雷特扩展属性"), Description("是否显示图标")]
- public bool Isico
- {
- get
- {
- return _Isico;
- }
- set
- {
- _Isico = value;
- if (value)
- {
- if (_Ico != null)
- {
- BaseText.Location = new Point(_IcoPadding.Left + _Ico.Width, 3);
- BaseText.Width = BaseText.Width - _IcoPadding.Left - _Ico.Width;
- }
- else
- {
- BaseText.Location = new Point(25, 3);
- BaseText.Width = BaseText.Width - 25;
- }
- }
- this.Invalidate();
- }
- }
- [Category("放肆雷特扩展属性"), Description("图标文件")]
- public Bitmap Ico
- {
- get
- {
- return _Ico;
- }
- set
- {
- _Ico = value;
- }
- }
- [Category("放肆雷特扩展属性"), Description("控件内部间距,图标文件")]
- public Padding IcoPadding
- {
- get { return _IcoPadding; }
- set
- {
- _IcoPadding = value;
- this.Invalidate();
- }
- }
- #endregion
复制代码
本文来自 放肆雷特 | 胖子的技术博客
|