距上篇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. .NET环境配置(二)

    打开IIS服务器   首先在设置程序池 应用程序池 设置  ASP.NET v4.0         ASP.NET v4.0 Classic CLassic.NET AppPool DefaultA ...

  2. iOS中UIKit——UIDataDetectors(数据检测器)它将电话、邮件、网址等变为链接

    1.它用于UITextView和UIWebView,属性名为:dataDetetorTypes 2.此属性可以设定使符合电话.邮件.网址.符合格式的日期等文字变为链接文字. 3.电话号码点击后拨出电话 ...

  3. c#使用DocX添加多级标题

    博客转移到 http://jacean.github.io/ 继续分享编程经验 先上效果.可以生成多级标题,但是不能生成1,1.1,1.2这样的自动序列, 只是这样的效果. 实现方法是给Paragra ...

  4. 例题6-10 The Falling Leaves,UVA699

    这道题我的思路是先通过递归构建树,然后进行遍历将位置和保存在map映射中,最后按顺序输出map集合中的值. 至于如何遍历,我是依次尝试了宽度优先遍历和深度优先遍历,当然这都是可以的.不过期间写错了很多 ...

  5. pjax 历史管理 jQuery.History.js

    更新 http://www.bootcdn.cn/jquery.pjax/ 简介 pjax是一个jQuery插件,使用ajax和pushState技术提供快速的浏览体验与真正的永久链接.网页标题.以及 ...

  6. MapReduce作业的map task和reduce task调度参数

    MapReduce作业可以细分为map task和reduce task,而MRAppMaster又将map task和reduce task分为四种状态: 1.pending:刚启动但尚未向reso ...

  7. JQuery ajax返回JSON时的处理方式

    最近在使用JQuery的ajax方法时,要求返回的数据为json数据,在处理的过程中遇到下面的几个问题,那就是采用不同的方式来生成json数据的时候,在$.ajax方法中应该是如何来处理的,下面依次来 ...

  8. php中intval()函数

    格式:int intval(mixed $var [, int $base]); 1.intval()的返回值是整型,1或者0.可作用于数组或者对象(对象报错信息:Notice: Object of ...

  9. ubuntu 12.04 LTS(64位)安装apache2

    在网上找了很多文章,说法不一,不知道应该用哪种方法,后来想就用其中最简单的吧,装不好再卸了重装, 然后就...装上了,用的是tar包源码安装,下面是步骤 1.去官网下载apache2.2.25源码包, ...

  10. [CentOS 7] 安装nginx第一步先搭建nginx服务器环境

    简要地介绍一下,如何在CentOS 7中安装nginx服务器 方法/步骤   下载对应当前系统版本的nginx包(package) # wget  http://nginx.org/packages/ ...