认知尚浅,如有错误,愿闻其详!
概述
在开发中,有时候需要,需要些自定义性很高的控件,而且使用的频率很高,这时候我们自己就要去修改其外观、宽高等属性,需要重写一些需要重写的事件,以达到效果。
今天在工作中遇到的界面,需要制作出一个类似处方笺的页面,传统的文本输入框是没办法直接使用的。而且使用的频率也很高,所以就想着自定义一个TextBox,满足项目需求。
平时中也可以用于账号输入或者是其他页面的输入,反正比传统的好看多了。
效果
自定义TextBox.gif
实现代码
public CTextBox()
{
InitializeComponent();
//步骤1、设置控件的基本属性。
this.BorderStyle = BorderStyle.None;
this.BackColor = Color.White;
this.AutoSize = false;
//为了让输入文本与底线有一定的距离,需要加上一定的高度值(文本是紧贴上方显示的),高度值允许用户于属性面板设置。
this.Height = this.FontHeight + TextSpaceLine;
}
//步骤2、控件属性,允许用户通过属性窗口进行设置
private int _TextSpaceLine = 6;
[DefaultValue(typeof(string), "6")]
[Description("文本与底部横线的间距")]
public int TextSpaceLine
{
get { return _TextSpaceLine; }
set
{
_TextSpaceLine = value;
}
}
private string _TextHint = "";
[DefaultValue(typeof(string), "")]
[Description("输入框输入提示!")]
public string TextHint
{
get { return _TextHint; }
set
{
_TextHint = value;
SetWatermark(TextHint);
}
}
private Color _LineColor = Color.FromArgb(69, 139, 116);
[DefaultValue(typeof(Color), "69,139,116")]
[Description("底部横线颜色")]
public Color LineColor
{
get { return _LineColor; }
set { _LineColor = value; }
}
//步骤3、利用win32 api进行水印的加入,具体实现不太清楚
private const uint ECM_FIRST = 0x1500;
private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
/// <summary>
/// 设置水印,相当于输入提示
/// </summary>
/// <param name="watermarkText">提示内容</param>
private void SetWatermark(string watermarkText)
{
SendMessage(this.Handle, EM_SETCUEBANNER, 0, watermarkText);
}
//步骤4、截获消息,在原来的下边框位置在画一条线
private int WM_PAINT = 0x000F;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
Pen pen = new Pen(LineColor, 2f);
using (Graphics g = this.CreateGraphics())
{
g.DrawLine(pen, new Point(0, this.Size.Height - 1), new Point(this.Size.Width, this.Size.Height - 1));
}
}
}
步骤1中,对TextBox控件的基本属性进行了设置,关闭自动尺寸、修改高度等操作。
步骤2中,声明实现一些需要通过外接属性设置的值属性,如底线颜色、文本与底线的间距、提示内容等属性。
步骤3、4中,获取句柄,使用Windows API进行设置水印与利用Graphics
绘制底线。水印具体实现可以看这:在 Visual C# 中,如何为 TextBox 控件添加水印文字 - 抢劫上帝
可设置属性.png