(二十八)c#Winform自定义控件-文本框(一)
官网
前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
欢迎前来交流探讨: 企鹅群568015492 idkey=6e08741ef16fe53bf0314c1c9e336c4f626047943a8b76bac062361bab6b4f8d">
目录
https://www.cnblogs.com/bfyx/p/11364884.html
准备工作
终于到文本框了,文本框将包含原文本框扩展,透明文本框,数字输入文本框,带边框文本框
本文将讲解原文本框扩展,主要增加水印和输入控制
开始
添加一个组件,命名TextBoxEx,继承TextBox
属性
private bool blnFocus = false;
private string _promptText = string.Empty;
private Font _promptFont = new Font("微软雅黑", 15f, FontStyle.Regular, GraphicsUnit.Pixel);
private Color _promptColor = Color.Gray;
private Rectangle _myRectangle = Rectangle.FromLTRB(, , , );
private TextInputType _inputType = TextInputType.NotControl;
private string _regexPattern = "";
private string m_strOldValue = string.Empty;
private decimal _maxValue = 1000000m;
private decimal _minValue = -1000000m;
private int _decLength = ;
/// <summary>
/// 水印文字
/// </summary>
[Description("水印文字"), Category("自定义")]
public string PromptText
{
get
{
return this._promptText;
}
set
{
this._promptText = value;
this.OnPaint(null);
}
}
[Description("水印字体"), Category("自定义")]
public Font PromptFont
{
get
{
return this._promptFont;
}
set
{
this._promptFont = value;
}
}
[Description("水印颜色"), Category("自定义")]
public Color PromptColor
{
get
{
return this._promptColor;
}
set
{
this._promptColor = value;
}
}
public Rectangle MyRectangle
{
get;
set;
}
public string OldText
{
get;
set;
}
[Description("获取或设置一个值,该值指示文本框中的文本输入类型。")]
public TextInputType InputType
{
get
{
return this._inputType;
}
set
{
this._inputType = value;
if (value != TextInputType.NotControl)
{
TextChanged -= new EventHandler(this.TextBoxEx_TextChanged);
TextChanged += new EventHandler(this.TextBoxEx_TextChanged);
}
else
{
TextChanged -= new EventHandler(this.TextBoxEx_TextChanged);
}
}
}
/// <summary>
/// 获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。
/// </summary>
[Description("获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。")]
public string RegexPattern
{
get
{
return this._regexPattern;
}
set
{
this._regexPattern = value;
}
}
/// <summary>
/// 当InputType为数字类型时,能输入的最大值
/// </summary>
[Description("当InputType为数字类型时,能输入的最大值。")]
public decimal MaxValue
{
get
{
return this._maxValue;
}
set
{
this._maxValue = value;
}
}
/// <summary>
/// 当InputType为数字类型时,能输入的最小值
/// </summary>
[Description("当InputType为数字类型时,能输入的最小值。")]
public decimal MinValue
{
get
{
return this._minValue;
}
set
{
this._minValue = value;
}
}
/// <summary>
/// 当InputType为数字类型时,能输入的最小值
/// </summary>
[Description("当InputType为数字类型时,小数位数。")]
public int DecLength
{
get
{
return this._decLength;
}
set
{
this._decLength = value;
}
}
一些事件
void TextBoxEx_KeyPress(object sender, KeyPressEventArgs e)
{
//以下代码 取消按下回车或esc的“叮”声
if (e.KeyChar == System.Convert.ToChar() || e.KeyChar == System.Convert.ToChar())
{
e.Handled = true;
}
} private void TextBoxEx_MouseUp(object sender, MouseEventArgs e)
{
if (this.blnFocus)
{
base.SelectAll();
this.blnFocus = false;
}
} private void TextBoxEx_GotFocus(object sender, EventArgs e)
{
this.blnFocus = true;
base.SelectAll();
} private void TextBoxEx_TextChanged(object sender, EventArgs e)
{
if (this.Text == "")
{
this.m_strOldValue = this.Text;
}
else if (this.m_strOldValue != this.Text)
{
if (!ControlHelper.CheckInputType(this.Text, this._inputType, this._maxValue, this._minValue, this._decLength, this._regexPattern))
{
int num = base.SelectionStart;
if (this.m_strOldValue.Length < this.Text.Length)
{
num--;
}
else
{
num++;
}
base.TextChanged -= new EventHandler(this.TextBoxEx_TextChanged);
this.Text = this.m_strOldValue;
base.TextChanged += new EventHandler(this.TextBoxEx_TextChanged);
if (num < )
{
num = ;
}
base.SelectionStart = num;
}
else
{
this.m_strOldValue = this.Text;
}
}
}
重绘
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (string.IsNullOrEmpty(this.Text) && !string.IsNullOrEmpty(this._promptText))
{
if (e == null)
{
using (Graphics graphics = Graphics.FromHwnd(base.Handle))
{
if (this.Text.Length == && !string.IsNullOrEmpty(this.PromptText))
{
TextFormatFlags textFormatFlags = TextFormatFlags.EndEllipsis | TextFormatFlags.VerticalCenter;
if (this.RightToLeft == RightToLeft.Yes)
{
textFormatFlags |= (TextFormatFlags.Right | TextFormatFlags.RightToLeft);
}
TextRenderer.DrawText(graphics, this.PromptText, this._promptFont, base.ClientRectangle, this._promptColor, textFormatFlags);
}
}
}
}
}
下面是完整代码
// 版权所有 黄正辉 交流群:568015492 QQ:623128629
// 文件名称:TextBoxEx.cs
// 创建日期:2019-08-15 16:03:44
// 功能描述:TextBox
// 项目地址:https://gitee.com/kwwwvagaa/net_winform_custom_control
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace HZH_Controls.Controls
{
public partial class TextBoxEx : TextBox
{
private bool blnFocus = false; private string _promptText = string.Empty; private Font _promptFont = new Font("微软雅黑", 15f, FontStyle.Regular, GraphicsUnit.Pixel); private Color _promptColor = Color.Gray; private Rectangle _myRectangle = Rectangle.FromLTRB(, , , ); private TextInputType _inputType = TextInputType.NotControl; private string _regexPattern = ""; private string m_strOldValue = string.Empty; private decimal _maxValue = 1000000m; private decimal _minValue = -1000000m; private int _decLength = ; /// <summary>
/// 水印文字
/// </summary>
[Description("水印文字"), Category("自定义")]
public string PromptText
{
get
{
return this._promptText;
}
set
{
this._promptText = value;
this.OnPaint(null);
}
} [Description("水印字体"), Category("自定义")]
public Font PromptFont
{
get
{
return this._promptFont;
}
set
{
this._promptFont = value;
}
} [Description("水印颜色"), Category("自定义")]
public Color PromptColor
{
get
{
return this._promptColor;
}
set
{
this._promptColor = value;
}
} public Rectangle MyRectangle
{
get;
set;
} public string OldText
{
get;
set;
} [Description("获取或设置一个值,该值指示文本框中的文本输入类型。")]
public TextInputType InputType
{
get
{
return this._inputType;
}
set
{
this._inputType = value;
if (value != TextInputType.NotControl)
{
TextChanged -= new EventHandler(this.TextBoxEx_TextChanged);
TextChanged += new EventHandler(this.TextBoxEx_TextChanged);
}
else
{
TextChanged -= new EventHandler(this.TextBoxEx_TextChanged);
}
}
}
/// <summary>
/// 获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。
/// </summary>
[Description("获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。")]
public string RegexPattern
{
get
{
return this._regexPattern;
}
set
{
this._regexPattern = value;
}
}
/// <summary>
/// 当InputType为数字类型时,能输入的最大值
/// </summary>
[Description("当InputType为数字类型时,能输入的最大值。")]
public decimal MaxValue
{
get
{
return this._maxValue;
}
set
{
this._maxValue = value;
}
}
/// <summary>
/// 当InputType为数字类型时,能输入的最小值
/// </summary>
[Description("当InputType为数字类型时,能输入的最小值。")]
public decimal MinValue
{
get
{
return this._minValue;
}
set
{
this._minValue = value;
}
}
/// <summary>
/// 当InputType为数字类型时,能输入的最小值
/// </summary>
[Description("当InputType为数字类型时,小数位数。")]
public int DecLength
{
get
{
return this._decLength;
}
set
{
this._decLength = value;
}
} public TextBoxEx()
{
this.InitializeComponent();
base.GotFocus += new EventHandler(this.TextBoxEx_GotFocus);
base.MouseUp += new MouseEventHandler(this.TextBoxEx_MouseUp);
base.KeyPress += TextBoxEx_KeyPress;
} void TextBoxEx_KeyPress(object sender, KeyPressEventArgs e)
{
//以下代码 取消按下回车或esc的“叮”声
if (e.KeyChar == System.Convert.ToChar() || e.KeyChar == System.Convert.ToChar())
{
e.Handled = true;
}
} private void TextBoxEx_MouseUp(object sender, MouseEventArgs e)
{
if (this.blnFocus)
{
base.SelectAll();
this.blnFocus = false;
}
} private void TextBoxEx_GotFocus(object sender, EventArgs e)
{
this.blnFocus = true;
base.SelectAll();
} private void TextBoxEx_TextChanged(object sender, EventArgs e)
{
if (this.Text == "")
{
this.m_strOldValue = this.Text;
}
else if (this.m_strOldValue != this.Text)
{
if (!ControlHelper.CheckInputType(this.Text, this._inputType, this._maxValue, this._minValue, this._decLength, this._regexPattern))
{
int num = base.SelectionStart;
if (this.m_strOldValue.Length < this.Text.Length)
{
num--;
}
else
{
num++;
}
base.TextChanged -= new EventHandler(this.TextBoxEx_TextChanged);
this.Text = this.m_strOldValue;
base.TextChanged += new EventHandler(this.TextBoxEx_TextChanged);
if (num < )
{
num = ;
}
base.SelectionStart = num;
}
else
{
this.m_strOldValue = this.Text;
}
}
} protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (string.IsNullOrEmpty(this.Text) && !string.IsNullOrEmpty(this._promptText))
{
if (e == null)
{
using (Graphics graphics = Graphics.FromHwnd(base.Handle))
{
if (this.Text.Length == && !string.IsNullOrEmpty(this.PromptText))
{
TextFormatFlags textFormatFlags = TextFormatFlags.EndEllipsis | TextFormatFlags.VerticalCenter;
if (this.RightToLeft == RightToLeft.Yes)
{
textFormatFlags |= (TextFormatFlags.Right | TextFormatFlags.RightToLeft);
}
TextRenderer.DrawText(graphics, this.PromptText, this._promptFont, base.ClientRectangle, this._promptColor, textFormatFlags);
}
}
}
}
} protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == || m.Msg == || m.Msg == )
{
this.OnPaint(null);
}
} protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
base.Invalidate();
}
}
}
用处及效果
用处:需要控制输入,需要显示水印
最后的话
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星 星吧
(二十八)c#Winform自定义控件-文本框(一)的更多相关文章
- (三十)c#Winform自定义控件-文本框(三)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (十六)c#Winform自定义控件-文本框哪里去了?-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- (二十九)c#Winform自定义控件-文本框(二)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (三十一)c#Winform自定义控件-文本框(四)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (二十)c#Winform自定义控件-有后退的窗体
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- NLP(二十八)多标签文本分类
本文将会讲述如何实现多标签文本分类. 什么是多标签分类? 在分类问题中,我们已经接触过二分类和多分类问题了.所谓二(多)分类问题,指的是y值一共有两(多)个类别,每个样本的y值只能属于其中的一 ...
- (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...
- VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器
VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器 View 传输服务器用于管理和简化数据中心与在最终用户本地系统上检出使用的 View 桌面之间的数据传输.必须安 ...
- (转载)Android项目实战(二十八):Zxing二维码实现及优化
Android项目实战(二十八):Zxing二维码实现及优化 前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中 ...
随机推荐
- 1. 在Mac OS中配置CMake的详细图文教程
CMake是一个比make更高级的跨平台的安装.编译.配置工具,可以用简单的语句来描述所有平台的安装(编译过程).并根据不同平台.不同的编译器,生成相应的Makefile或者project文件.本文主 ...
- 数据结构-双向链表(Python实现)
数据结构在编程世界中一直是非常重要的一环,不管是开发还是算法,哪怕是单纯为了面试,数据结构都是必修课,今天我们介绍链表中的一种--双向链表的代码实现. 好了,话不多说直接上代码. 双向链表 首先,我们 ...
- ASP.NET--Web服务器端控件和Html控件
今天学习总结了一些相关概念和知识. 之前无论是做 单机的winform 还是 CS的winform 感觉,不到两年下来感觉还可以,虽然API有很多,但是还是比较熟悉基于WINDOWS消息机制的编程,但 ...
- python爬虫笔记之re.IGNORECASE
re.IGNORECASE有什么用?re.IGNORECASE是什么意思?(原谅我抓下seo..) 这里自己总结下: re.IGNORECASE是compile函数中的一个匹配模式. re.IGNOR ...
- Python爬虫学习代码
[1]用一个简单的程序来显示Python的数字类型. code: class ShowNumType(object): def __init__(self): self.showInt() self. ...
- iconfontのsymbol的使用
iconfontのsymbol的使用 iconfont三种方式的优缺点 unicode 优点: 1.兼容性最好,支持ie6+ 2.支持按字体的方式去动态调整图标大小,颜色等等 缺点: 1.不支持多色图 ...
- get 请求和post请求的具体区别
get请求是向服务器索要数据,post请求是向服务器传送数据 的,浏览器限制了get的传送量,post可以大量的把数据传给 服务器,一般情况下get请求,请求体是空的,请求只发一次 ,如果是post请 ...
- python基础之元祖、嵌套,for循环、 enumerate、range的试用案例
元祖又叫做只读列表,可循环查询.可切片,元祖里的直接元素不能更改,但是若里面有嵌套的列表,则可以修改列表里的元素 tu = (1,2,3,'sun',[3,4,5,'cat']) tu[4][3] = ...
- python带有GIL解释器锁
1.GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定. 2.每个CPU在同一时间只能执行一个线程(在 ...
- [ PyQt入门教程 ] Qt Designer工具的使用
Qt Designer是PyQt程序UI界面的实现工具,Qt Designer工具使用简单,可以通过拖拽和点击完成复杂界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用.本文 ...