c#: TextBox添加水印效果(PlaceHolderText)

时间:2023-03-09 13:14:08
c#: TextBox添加水印效果(PlaceHolderText)

基于他人代码修改,不闪,以做备忘。

与SendMessage EM_SETCUEBANNER消息相比,它能改变字体绘制颜色,EM_SETCUEBANNER只限定了DimGray颜色,太深

    //与SendMessage EM_SETCUEBANNER消息相比,它能改变字体绘制颜色,EM_SETCUEBANNER只限定了DimGray颜色,太深
[ToolboxBitmap(typeof(TextBox))]
public class TextBoxEx : TextBox
{
private const int WM_PAINT = 0xF;
private Color placeHolderColor = Color.Gray;
private string placeHolderText; [DefaultValue("")]
[Localizable(true)]
[Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public string PlaceHolderText
{
get { return this.placeHolderText; }
set
{
this.placeHolderText = value;
Invalidate();
}
} protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_PAINT)
WmPaint(ref m);
} private void WmPaint(ref Message m)
{
if (!string.IsNullOrEmpty(this.Text) || string.IsNullOrEmpty(this.placeHolderText) || Focused)
return; using (var g = Graphics.FromHwnd(this.Handle))
{
var flag = TextFormatFlags.EndEllipsis;
//它反着来
if (RightToLeft == RightToLeft.Yes)
{
flag |= TextFormatFlags.RightToLeft;
if (TextAlign == HorizontalAlignment.Left)
flag |= TextFormatFlags.Right;
else if (TextAlign == HorizontalAlignment.Right)
flag |= TextFormatFlags.Left;
}
else
{
switch (TextAlign)
{
case HorizontalAlignment.Center:
flag |= TextFormatFlags.HorizontalCenter;
break;
case HorizontalAlignment.Right:
flag |= TextFormatFlags.Right;
break;
default:
break;
}
} var r = this.ClientRectangle;
r.Offset(-, );
TextRenderer.DrawText(
g,
this.placeHolderText,
Font,
r,
this.placeHolderColor,
flag
);
}
}
}

效果如图:

c#: TextBox添加水印效果(PlaceHolderText)

参考资料:

C# WinForm TextBox添加水印效果 - ZCoding - 博客园