我自定义了一个控件,继承自UserControl;里面组合了一个PirctureBox和TextBox,我重写了UserControl的WndProc方法,其目的是绘制UserControl的边框和像TextBox的水印文字提示效果,像html input 标签里的属性PlaceHolder那样,也就是当这个TextBox框失去焦点或者里面的字符长度为0,并且提示文字长度大于0的时候,就出现提示文字,否则就不出现。但是现在却是这样的情况:
控件被拖动到窗体之后,水印文字显示出来没问题,但是当鼠标点击窗体的其他区域之后,水印文字就会消失一大部分,并且运行的时候TextBox里的水印提示也只显示了一小部分,失去焦点也不消失,输入了文字也不消失。
代码:
if (m.Msg == 0xf || m.Msg == 0x133)
{
IntPtr hDC = GetWindowDC(m.HWnd);
if (hDC.ToInt32() == 0)
{
return;
}
//只有在边框样式为FixedSingle时自定义边框样式才有效
if (this.BorderStyle == BorderStyle.FixedSingle)
{
System.Drawing.Graphics g = Graphics.FromHdc(hDC);
//边框Width为1个像素
System.Drawing.Pen pen = new Pen(Brushes.DarkRed, 1);
//绘制边框
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.DrawRectangle(pen, 0, 0, this.Width - 1, this.Height - 1);
pen.Dispose();
}
if (!this.textBox.Focused && (this.textBox.TextLength == 0) && promotedText.Length>0)
{
Graphics g1 = this.textBox.CreateGraphics();
g1.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
TextFormatFlags tff = (TextFormatFlags.EndEllipsis |
TextFormatFlags.NoPrefix | TextFormatFlags.Left |
TextFormatFlags.Top | TextFormatFlags.NoPadding);
Rectangle rec = this.textBox.ClientRectangle;
rec.Offset(2, 1);
TextRenderer.DrawText(g1, promotedText, new Font("微软雅黑",10), rec, SystemColors.GrayText,Color.White);
g1.Dispose();
}
//返回结果
m.Result = IntPtr.Zero;
//释放
ReleaseDC(m.HWnd, hDC);![](https://img2018.cnblogs.com/q/1347657/201908/1347657-20190804195018750-1743697989.gif)
把简单的事复杂化。
1. .net能不用win32的没必要使用win32,无论从简易还是强健优先使用.net接口。
2. 如果按照第一步,就不会有第二步的问题,明明一个TextChanged 使重绘 就搞定的问题。
没必要自己去画,设置button的背景图片就行了,再加个change事件,有值就隐藏背景image,没值就显示出来