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、变量声明
#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安全卫士窗体(三)的更多相关文章
- C#制作高仿360安全卫士窗体<二>
继上次C#制作高仿360安全卫士窗体<一>发布之后响应还不错,我的博客放肆雷特也来了不少的新朋友,在这里先谢谢大家的支持!我自己也反复看了一下觉得对不起大家,写的非常乱而且很少文字介绍.在 ...
- C#制作高仿360安全卫士窗体(四)- 水晶按钮
项目越来越紧,我也乐此不疲.自从上次C#制作高仿360安全卫士窗体(三)出来之后,就开始有一些人在说为什么还在坚持写这么落后的东西.我想说的是,我是从事企业信息化工作的,所有程序都只对内部使用.所以只 ...
- C#制作高仿360安全卫士窗体3
C#制作高仿360安全卫士窗体(三) 距上篇C#制作高仿360安全卫士窗体(二)也将近一个多月了,这个月事情还是像往常一样的多.不多我也乐在其中,毕竟我做的是我喜欢做的东西.今天特地抽空把怎么制作 ...
- C#制作高仿360安全卫士窗体2
C#制作高仿360安全卫士窗体 继上次C#制作高仿360安全卫士窗体<一>发布之后响应还不错,我的博客放肆雷特也来了不少的新朋友,在这里先谢谢大家的支持!我自己也反复看了一下觉得对不起大家 ...
- C#制作高仿360安全卫士窗体<一>
开始写这一系列博客之前先要向大家说声抱歉,放肆雷特建立很久却很少有更新.当然博客人气也不旺,大部分都是看的人多评论收藏的人少.一直想要改变这种状态,正好赶上了最近工作上做了一个高仿360安全卫士窗体. ...
- 高仿360界面的实现(用纯XML和脚本实现)
源码下载:360UI 本项目XML的桌面渲染依赖GQT开源项目(请感兴趣的朋友加入QQ讨论群:101189702,在群共享文件里下载GQT源码),以下是360界面实现的全部XML代码,所有的代码都在3 ...
- 制作高仿QQ的聊天系统(上)—— 布局文件 & 减少过度绘制
由于没有自己的服务器,我就找了个能实现双方通信的SDK,这个SDK是友盟的用户反馈SDK.本系列的博文关注的不是网络通信,而是如何在网络通信机制已经做好的情况下,做出一个可用的聊天系统.其实,刚开始做 ...
- C# WPF仿360安全卫士11
首先上效果图: 这是我的第一篇随笔,最近因为写一个播放器,开始学习WPF相关技术,随着不断入坑,播放器倒是做出来了,掉坑里了... 本着闲着也是闲着的精神,拿360开刀了: 主界面主要使用DMSkin ...
- (原创)高仿360云盘android端的UI实现
前些日子几大互联网巨头展开了一轮网盘空间大战.一下子从G级别提高到了T级别.以后谁的空间没有1T估计都不好意思开口了~~~ 试用了一下360云盘的客户端,比较小清新(不是给360打广告~~~).刚好U ...
随机推荐
- 使用JDBC向数据库中插入一条数据(第一次修改版)
增加了一个Tools类,放了一些常用的工具 package com.JDBC.java; import java.io.IOException; import java.io.InputStream; ...
- js 实现获取对象所有键名(key)的方法
1.for in 循环 并且使用hasOwnProperty 方法 var jsonObject1 = { "name": "xiaoming", " ...
- activiti搭建(五)BPMN介绍
转载请注明源地址:http://www.cnblogs.com/lighten/p/5931207.html 对于BPMN我也不是十分清楚,目前也只是因为对于Modeler中不熟悉的组件查询,来对这部 ...
- 建立交叉编译环境(arm-linux-gcc)
linux系统内核版本:2.6.32-358.el6.x86_64(在64位系统上安装32位程序需要另外安装一些库) arm-linux-gcc版本:本文安装的是友善之臂tiny6410光盘中自带的a ...
- linux内核中的min(x, y)和max(x, y)宏定义
/linux/include/linux/kernel.h中有min(x, y)和max(x, y)的定义如下: #define min(x, y) ({ \ typeof(x) _min1 = x; ...
- [leetcode]_Pascal's Triangle II
题目:Pascal三角的变形,要求只用O(K)的额外空间. 思路:由于Pascal三角中,tri[n][i] = tri[n - 1][i] + tri[n-1][i-1],(通常情况下) 如果已经获 ...
- Uva 1588 Kickdown
这道题思路并不难想,在做题过程中主要遇到的困难有: 因为没有仔细的考虑边界情况,没有分析全面,导致因=没有取到而得不出正确结果,浪费的大量时间. 今后在做这类题目时,一定要先进行一个比较全面的分析+模 ...
- hive到hbase的使用
一.简单介绍 hive的元数据保存在metastore里面,真实的数据一般位于hdfs中,可以通过hql来对数据进行分析.hbase中的数据也是存放在hdfs上的,可不可以使用hive来分析hbase ...
- [译]Cassandra的数据读写与压缩
本文翻译主要来自Datastax的cassandra1.2文档.http://www.datastax.com/documentation/cassandra/1.2/index.html.此外还有一 ...
- 通过messenger实现activity与service的相互通信
布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to ...