Files
VisionEdit/UsingControl/HZHControls/Controls/Text/TextBoxEx.cs
eggplantlwj 62477b8091 1、修复因加入输入位姿引发的BUG
2、PMA工具完善
3、其他BUG修复
2022-03-21 14:48:26 +08:00

393 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ***********************************************************************
// Assembly : HZH_Controls
// Created : 08-08-2019
//
// ***********************************************************************
// <copyright file="TextBoxEx.cs">
// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com
// </copyright>
//
// Blog: https://www.cnblogs.com/bfyx
// GitHubhttps://github.com/kwwwvagaa/NetWinformControl
// giteehttps://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
{
/// <summary>
/// Class TextBoxEx.
/// Implements the <see cref="System.Windows.Forms.TextBox" />
/// </summary>
/// <seealso cref="System.Windows.Forms.TextBox" />
public partial class TextBoxEx : TextBox
{
/// <summary>
/// The BLN focus
/// </summary>
private bool blnFocus = false;
/// <summary>
/// The prompt text
/// </summary>
private string _promptText = string.Empty;
/// <summary>
/// The prompt font
/// </summary>
private Font _promptFont = new Font("微软雅黑", 15f, FontStyle.Regular, GraphicsUnit.Pixel);
/// <summary>
/// The prompt color
/// </summary>
private Color _promptColor = Color.Gray;
/// <summary>
/// My rectangle
/// </summary>
private Rectangle _myRectangle = Rectangle.FromLTRB(1, 3, 1000, 3);
/// <summary>
/// The input type
/// </summary>
private TextInputType _inputType = TextInputType.NotControl;
/// <summary>
/// The regex pattern
/// </summary>
private string _regexPattern = "";
/// <summary>
/// The m string old value
/// </summary>
private string m_strOldValue = string.Empty;
/// <summary>
/// The maximum value
/// </summary>
private decimal _maxValue = 1000000m;
/// <summary>
/// The minimum value
/// </summary>
private decimal _minValue = -1000000m;
/// <summary>
/// The decimal length
/// </summary>
private int _decLength = 2;
/// <summary>
/// 水印文字
/// </summary>
/// <value>The prompt text.</value>
[Description("水印文字"), Category("自定义")]
public string PromptText
{
get
{
return this._promptText;
}
set
{
this._promptText = value;
this.OnPaint(null);
}
}
/// <summary>
/// Gets or sets the prompt font.
/// </summary>
/// <value>The prompt font.</value>
[Description("水印字体"), Category("自定义")]
public Font PromptFont
{
get
{
return this._promptFont;
}
set
{
this._promptFont = value;
}
}
/// <summary>
/// Gets or sets the color of the prompt.
/// </summary>
/// <value>The color of the prompt.</value>
[Description("水印颜色"), Category("自定义")]
public Color PromptColor
{
get
{
return this._promptColor;
}
set
{
this._promptColor = value;
}
}
/// <summary>
/// Gets or sets my rectangle.
/// </summary>
/// <value>My rectangle.</value>
public Rectangle MyRectangle
{
get;
set;
}
/// <summary>
/// Gets or sets the old text.
/// </summary>
/// <value>The old text.</value>
public string OldText
{
get;
set;
}
/// <summary>
/// Gets or sets the type of the input.
/// </summary>
/// <value>The type of the input.</value>
[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>
/// <value>The regex pattern.</value>
[Description("获取或设置一个值该值指示当输入类型InputType=Regex时使用的正则表达式。")]
public string RegexPattern
{
get
{
return this._regexPattern;
}
set
{
this._regexPattern = value;
}
}
/// <summary>
/// 当InputType为数字类型时能输入的最大值
/// </summary>
/// <value>The maximum value.</value>
[Description("当InputType为数字类型时能输入的最大值。")]
public decimal MaxValue
{
get
{
return this._maxValue;
}
set
{
this._maxValue = value;
}
}
/// <summary>
/// 当InputType为数字类型时能输入的最小值
/// </summary>
/// <value>The minimum value.</value>
[Description("当InputType为数字类型时能输入的最小值。")]
public decimal MinValue
{
get
{
return this._minValue;
}
set
{
this._minValue = value;
}
}
/// <summary>
/// 当InputType为数字类型时能输入的最小值
/// </summary>
/// <value>The length of the decimal.</value>
[Description("当InputType为数字类型时小数位数。")]
public int DecLength
{
get
{
return this._decLength;
}
set
{
this._decLength = value;
}
}
/// <summary>
/// Initializes a new instance of the <see cref="TextBoxEx" /> class.
/// </summary>
public TextBoxEx()
{
this.InitializeComponent();
base.GotFocus += new EventHandler(this.TextBoxEx_GotFocus);
base.MouseUp += new MouseEventHandler(this.TextBoxEx_MouseUp);
base.KeyPress += TextBoxEx_KeyPress;
}
/// <summary>
/// Handles the KeyPress event of the TextBoxEx control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="KeyPressEventArgs" /> instance containing the event data.</param>
void TextBoxEx_KeyPress(object sender, KeyPressEventArgs e)
{
//以下代码 取消按下回车或esc的“叮”声
if (e.KeyChar == System.Convert.ToChar(13) || e.KeyChar == System.Convert.ToChar(27))
{
e.Handled = true;
}
}
/// <summary>
/// Handles the MouseUp event of the TextBoxEx control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="MouseEventArgs" /> instance containing the event data.</param>
private void TextBoxEx_MouseUp(object sender, MouseEventArgs e)
{
if (this.blnFocus)
{
base.SelectAll();
this.blnFocus = false;
}
}
/// <summary>
/// Handles the GotFocus event of the TextBoxEx control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
private void TextBoxEx_GotFocus(object sender, EventArgs e)
{
this.blnFocus = true;
base.SelectAll();
}
/// <summary>
/// Handles the TextChanged event of the TextBoxEx control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
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;
}
}
}
/// <summary>
/// 引发 <see cref="E:System.Windows.Forms.Control.Paint" /> 事件。
/// </summary>
/// <param name="e">包含事件数据的 <see cref="T:System.Windows.Forms.PaintEventArgs" />。</param>
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);
}
}
}
}
}
/// <summary>
/// 处理 Windows 消息。
/// </summary>
/// <param name="m">一个 Windows 消息对象。</param>
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();
}
}
/// <summary>
/// Handles the <see cref="E:TextChanged" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
base.Invalidate();
}
}
}