Winform 自定义文本框
2021-04-04 04:25
标签:class extern width tle awl winform rest box run Winform 自定义文本框 标签:class extern width tle awl winform rest box run 原文地址:https://www.cnblogs.com/belx/p/9190340.htmlusing System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TomWinform.CustomerControl
{
public partial class BorderTextBox : TextBox
{
//设置Rect消息
private const int EM_SETRECT = 179;
//获取Rect消息
private const int EM_GETRECT = 178;
//粘贴消息
private const int WM_PASTE = 0x0302;
private Color borderColor = Color.Black;
private float leftBorderSize = 1;
private float rightBorderSize = 1;
private float topBorderSize = 1;
private float bottomBorderSize = 1;
private Padding textPadding = new Padding(1);
private bool allowReturn = false;
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr GetWindowDC(IntPtr hWnd);
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref Rectangle lParam);
public BorderTextBox()
{
InitializeComponent();
}
//画边框
private void DrawBorder(IntPtr hDC)
{
Graphics g = Graphics.FromHdc(hDC);
#region 左边框
if (leftBorderSize > 0)
{
Pen penLeft = new Pen(borderColor, leftBorderSize);
Point[] pointLeft = new Point[2];
pointLeft[0] = new Point(0, 0);
pointLeft[1] = new Point(0, this.Width - 1);
g.DrawLine(penLeft, pointLeft[0], pointLeft[1]);
}
#endregion
#region 右边框
if (rightBorderSize > 0)
{
Pen penRight = new Pen(borderColor, rightBorderSize);
Point[] pointRight = new Point[2];
pointRight[0] = new Point(this.Width - 1, 0);
pointRight[1] = new Point(this.Width - 1, this.Height - 1);
g.DrawLine(penRight, pointRight[0], pointRight[1]);
}
#endregion
#region 上边框
if (topBorderSize > 0)
{
Pen penTop = new Pen(borderColor, topBorderSize);
Point[] pointTop = new Point[2];
pointTop[0] = new Point(0, 0);
pointTop[1] = new Point(this.Width - 1, 0);
g.DrawLine(penTop, pointTop[0], pointTop[1]);
}
#endregion
#region 下边框
if (bottomBorderSize > 0)
{
Pen penBottom = new Pen(borderColor, bottomBorderSize);
Point[] pointBottom = new Point[2];
pointBottom[0] = new Point(0, this.Height - 1);
pointBottom[1] = new Point(this.Width - 1, this.Height - 1);
g.DrawLine(penBottom, pointBottom[0], pointBottom[1]);
}
#endregion
}
public void SetTextDispLayout()
{
if (Text == "")
return;
//当允许多行和禁止会车时,Paddin有效
if (this.Multiline && (!this.WordWrap))
{
Rectangle rect = new Rectangle();
SendMessage(this.Handle, EM_GETRECT, (IntPtr)0, ref rect);
//SizeF size = CreateGraphics().MeasureString(Text, Font);
//rect.Y = (int)(Height - size.Height) / 2 + TextPadding.Top;
rect.Y = textPadding.Top;
rect.X = textPadding.Left;
rect.Height = Height;
rect.Width = Width - textPadding.Right - textPadding.Left;
SendMessage(this.Handle, EM_SETRECT, IntPtr.Zero, ref rect);
}
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
protected override void WndProc(ref Message m)
{
//string str = "";
//bool flag = false;
//int i = 0;
//if (m.Msg == 0x0204)
// i++;
//if (!AllowReturn
// && m.Msg == WM_PASTE
// && System.Windows.Forms.Clipboard.ContainsText())
//{
// str = System.Windows.Forms.Clipboard.GetText();
// System.Windows.Forms.Clipboard.Clear();
// string nstr = str.Replace(char.ConvertFromUtf32((int)Keys.Return), "").Replace(char.ConvertFromUtf32((int)Keys.LineFeed), "");
// System.Windows.Forms.Clipboard.SetText(nstr);
// if (str.Length > 0) flag = true;
//}
base.WndProc(ref m);
if (m.Msg == 0xf || m.Msg == 0x133)
{
IntPtr hDC = GetWindowDC(m.HWnd);
if (hDC.ToInt32() == 0)
return;
DrawBorder(hDC);
//返回结果
m.Result = IntPtr.Zero;
//释放
ReleaseDC(m.HWnd, hDC);
}
//if (flag)
//{
// flag = false;
// System.Windows.Forms.Clipboard.SetText(str);
// str = "";
//}
}
#region 属性
[Description("边框颜色"), Category("自定义属性")]
public Color BorderColor
{
get { return borderColor; }
set { borderColor = value; this.Invalidate(); }
}
[Description("左边框宽度"), Category("自定义属性")]
public float LeftBorderSize
{
get { return leftBorderSize; }
set { leftBorderSize = value; this.Invalidate(); }
}
[Description("右边框宽度"), Category("自定义属性")]
public float RightBorderSize
{
get { return rightBorderSize; }
set { rightBorderSize = value; this.Invalidate(); }
}
[Description("上边框宽度"), Category("自定义属性")]
public float TopBorderSize
{
get { return topBorderSize; }
set { topBorderSize = value; this.Invalidate(); }
}
[Description("下边框宽度"), Category("自定义属性")]
public float BottomBorderSize
{
get { return bottomBorderSize; }
set { bottomBorderSize = value; this.Invalidate(); }
}
[/*DisplayName("內邊距")*/Description("文本内边距,当允许多行和禁止回车时有效"), Category("自定义属性")]
public Padding TextPadding
{
get { return textPadding; }
set { textPadding = value; SetTextDispLayout(); }
}
[/*DisplayName("允許回車")*/Description("是否允许回车"), Category("自定义属性")]
public bool AllowReturn
{
get { return allowReturn; }
set { allowReturn = value;this.Invalidate(); }
}
#endregion
#region 事件
protected override void OnKeyPress(KeyPressEventArgs e)
{
//如果不允许回车 屏蔽回车 换行键值
if (!AllowReturn
&& ((int)e.KeyChar == (int)Keys.Return || (int)e.KeyChar == (int)Keys.LineFeed))
{
e.Handled = true;
}
base.OnKeyPress(e);
}
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
SetTextDispLayout();
}
#endregion
}
}