距上篇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(, , , );
//枚鼠标状态
private enum State
{
Normal = ,
MouseOver = ,
MouseDown = ,
Disable = ,
Default =
}
#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 - ;
}
else
{
base.Height = ;
BaseText.Height = ;
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, );
BaseText.Width = BaseText.Width - _IcoPadding.Left - _Ico.Width;
}
else
{
BaseText.Location = new Point(, );
BaseText.Width = BaseText.Width - ;
}
}
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

4、委托,委托图标点击事件

 #region 委托
public event EventHandler IcoOnclick;
#endregion

5、方法处理

 #region 方法
protected override void OnPaint(PaintEventArgs e)
{
Rectangle rc = this.ClientRectangle;
Graphics g = e.Graphics;
ImageDrawRect.DrawRect(g, _TextBoxBackImg, rc, Rectangle.FromLTRB(, , , ), (int)state, );
if (_Isico)
{
if (_Ico != null)
{
g.DrawImage(_Ico, new Point(_IcoPadding.Left, _IcoPadding.Top));
}
}
base.OnPaint(e);
} private void TextBoxEx_Resize(object sender, EventArgs e)
{
if (this.Height > )
{
Multiline = true;
}
else
{
this.Height = ;
Multiline = false;
}
} private void NotifyIcoOnclick()
{
if (IcoOnclick != null)
{
IcoOnclick(this, EventArgs.Empty);
}
} public void AppendText(string ss)
{
BaseText.AppendText(ss);
} private void BaseText_MouseEnter(object sender, EventArgs e)
{
state = State.MouseOver;
this.Invalidate();
} private void BaseText_MouseLeave(object sender, EventArgs e)
{
state = State.Normal;
this.Invalidate();
} private void TextBoxEx_MouseUp(object sender, MouseEventArgs e)
{
if (_Ico != null)
{
if (new Rectangle(_IcoPadding.Left, _IcoPadding.Top, _Ico.Width, _Ico.Height).Contains(e.X, e.Y))
{
NotifyIcoOnclick();
}
}
} private void TextBoxEx_MouseEnter(object sender, EventArgs e)
{
state = State.MouseOver;
this.Invalidate();
} private void TextBoxEx_MouseLeave(object sender, EventArgs e)
{
state = State.Normal;
this.Invalidate();
}
#endregion

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


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

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

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

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

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

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

  3. 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. 制作高仿QQ的聊天系统(上)—— 布局文件 & 减少过度绘制

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

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

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

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

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

随机推荐

  1. Ajax实现步骤和原理

    1.获取ajax异步对象     IE4~IE12 : 使用new ActiveXObject("microsoft.xmlhttp");     非IE : 使用new XMLH ...

  2. Data Mover Script Templates

    Datamover is probably the best way to export and import data between PeopleSoft databases and the sc ...

  3. Configuring Report Manager

     Steps to configure and get Reports in Report manager. 1. Enable getting Reports in Report Manager. ...

  4. ThinkPHP常用变量

    __ROOT__  : 网站根目录地址 __APP__  : 当前项目(入口文件)地址 __GROUP__:当前分组地址 __URL__  : 当前模块地址 __ACTION__ : 当前操作地址 _ ...

  5. 使用了Theme但是没有效果问题

    最近在开发过程中使用了theme移植Preference并使用了一些android样式,但是在自定义的Theme修改了相关参数后却无法实现 可能有些朋友还不知道怎么用.这里也做个简要的使用方式说明. ...

  6. div+css的优势在哪?

    1.符合W3C标准.微软等公司都是他的支持者. 2.所搜引擎更加友好. 3.样式调整更加方便. 4.css简洁的代码,减少了带宽. 5.表现和结构分离.在团队开发中更容易分工 并不是取代table,t ...

  7. 访问svc 文件,编译器错误消息: CS0016,未能写入输出文件

    编译错误              说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码.             编译器错误消息: CS0016: 未 ...

  8. Keil的使用方法 - 常用功能(一)

    Ⅰ.概述 学习一门软件的开发,开发工具的掌握可以说尤为重要.由于Keil集成开发工具支持多种MCU平台的开发,是市面上比较常见的,也是功能比较强大一款IDE.所以,对于大多数人说,选择Keil几乎是单 ...

  9. MVC中的奇葩错误,参数转对象

    在使用MVC中遇到一个神奇的错误,特此记录(我在用MVC4时遇到) 上面两张图就是一个变量名进行了修改,其他不变!form里面的参数也是一样的!喜欢尝试的可以尝试一下! 我的变量使用action时出现 ...

  10. Java程序员要注意的10个问题————————好东西就是要拿来分享

    [本文来自优优码:http://www.uucode.net/201406/ten-issue-for-java],好东西就是要拿来分享 1. Array 转为 ArrayList 很多人会这么写: ...