// *********************************************************************** // 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(); } } }