// ***********************************************************************
// Assembly : HZH_Controls
// Created : 08-08-2019
//
// ***********************************************************************
//
// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com
//
//
// Blog: https://www.cnblogs.com/bfyx
// GitHub:https://github.com/kwwwvagaa/NetWinformControl
// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
//
// If you use this code, please keep this note.
// ***********************************************************************
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
{
///
/// Class TextBoxEx.
/// Implements the
///
///
public partial class TextBoxEx : TextBox
{
///
/// The BLN focus
///
private bool blnFocus = false;
///
/// The prompt text
///
private string _promptText = string.Empty;
///
/// The prompt font
///
private Font _promptFont = new Font("微软雅黑", 15f, FontStyle.Regular, GraphicsUnit.Pixel);
///
/// The prompt color
///
private Color _promptColor = Color.Gray;
///
/// My rectangle
///
private Rectangle _myRectangle = Rectangle.FromLTRB(1, 3, 1000, 3);
///
/// The input type
///
private TextInputType _inputType = TextInputType.NotControl;
///
/// The regex pattern
///
private string _regexPattern = "";
///
/// The m string old value
///
private string m_strOldValue = string.Empty;
///
/// The maximum value
///
private decimal _maxValue = 1000000m;
///
/// The minimum value
///
private decimal _minValue = -1000000m;
///
/// The decimal length
///
private int _decLength = 2;
///
/// 水印文字
///
/// The prompt text.
[Description("水印文字"), Category("自定义")]
public string PromptText
{
get
{
return this._promptText;
}
set
{
this._promptText = value;
this.OnPaint(null);
}
}
///
/// Gets or sets the prompt font.
///
/// The prompt font.
[Description("水印字体"), Category("自定义")]
public Font PromptFont
{
get
{
return this._promptFont;
}
set
{
this._promptFont = value;
}
}
///
/// Gets or sets the color of the prompt.
///
/// The color of the prompt.
[Description("水印颜色"), Category("自定义")]
public Color PromptColor
{
get
{
return this._promptColor;
}
set
{
this._promptColor = value;
}
}
///
/// Gets or sets my rectangle.
///
/// My rectangle.
public Rectangle MyRectangle
{
get;
set;
}
///
/// Gets or sets the old text.
///
/// The old text.
public string OldText
{
get;
set;
}
///
/// Gets or sets the type of the input.
///
/// The type of the input.
[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);
}
}
}
///
/// 获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。
///
/// The regex pattern.
[Description("获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。")]
public string RegexPattern
{
get
{
return this._regexPattern;
}
set
{
this._regexPattern = value;
}
}
///
/// 当InputType为数字类型时,能输入的最大值
///
/// The maximum value.
[Description("当InputType为数字类型时,能输入的最大值。")]
public decimal MaxValue
{
get
{
return this._maxValue;
}
set
{
this._maxValue = value;
}
}
///
/// 当InputType为数字类型时,能输入的最小值
///
/// The minimum value.
[Description("当InputType为数字类型时,能输入的最小值。")]
public decimal MinValue
{
get
{
return this._minValue;
}
set
{
this._minValue = value;
}
}
///
/// 当InputType为数字类型时,能输入的最小值
///
/// The length of the decimal.
[Description("当InputType为数字类型时,小数位数。")]
public int DecLength
{
get
{
return this._decLength;
}
set
{
this._decLength = value;
}
}
///
/// Initializes a new instance of the class.
///
public TextBoxEx()
{
this.InitializeComponent();
base.GotFocus += new EventHandler(this.TextBoxEx_GotFocus);
base.MouseUp += new MouseEventHandler(this.TextBoxEx_MouseUp);
base.KeyPress += TextBoxEx_KeyPress;
}
///
/// Handles the KeyPress event of the TextBoxEx control.
///
/// The source of the event.
/// The instance containing the event data.
void TextBoxEx_KeyPress(object sender, KeyPressEventArgs e)
{
//以下代码 取消按下回车或esc的“叮”声
if (e.KeyChar == System.Convert.ToChar(13) || e.KeyChar == System.Convert.ToChar(27))
{
e.Handled = true;
}
}
///
/// Handles the MouseUp event of the TextBoxEx control.
///
/// The source of the event.
/// The instance containing the event data.
private void TextBoxEx_MouseUp(object sender, MouseEventArgs e)
{
if (this.blnFocus)
{
base.SelectAll();
this.blnFocus = false;
}
}
///
/// Handles the GotFocus event of the TextBoxEx control.
///
/// The source of the event.
/// The instance containing the event data.
private void TextBoxEx_GotFocus(object sender, EventArgs e)
{
this.blnFocus = true;
base.SelectAll();
}
///
/// Handles the TextChanged event of the TextBoxEx control.
///
/// The source of the event.
/// The instance containing the event data.
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 < 0)
{
num = 0;
}
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 == 0 && !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);
}
}
}
}
}
///
/// 处理 Windows 消息。
///
/// 一个 Windows 消息对象。
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 15 || m.Msg == 7 || m.Msg == 8)
{
this.OnPaint(null);
//Invalidate();
}
}
///
/// Handles the event.
///
/// The instance containing the event data.
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
base.Invalidate();
}
}
}