winform自定义控件,在TextBox绘制水印提示,文字显示不出来

我自定义了一个控件,继承自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);
winform自定义控件,在TextBox绘制水印提示,文字显示不出来

            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 使重绘 就搞定的问题。

以上是 winform自定义控件,在TextBox绘制水印提示,文字显示不出来 的全部内容, 来源链接: utcz.com/a/119752.html

回到顶部