首页 新闻 会员 周边

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

0
悬赏园豆:30 [已解决问题] 解决于 2021-03-03 22:33

我自定义了一个控件,继承自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)
HelloLLLLL的主页 HelloLLLLL | 菜鸟二级 | 园豆:434
提问于:2019-08-04 19:50
< >
分享
最佳答案
1

把简单的事复杂化。

1.  .net能不用win32的没必要使用win32,无论从简易还是强健优先使用.net接口。

2.  如果按照第一步,就不会有第二步的问题,明明一个TextChanged 使重绘 就搞定的问题。

收获园豆:18
花飘水流兮 | 专家六级 |园豆:13560 | 2019-08-05 10:02
其他回答(1)
1

没必要自己去画,设置button的背景图片就行了,再加个change事件,有值就隐藏背景image,没值就显示出来

收获园豆:12
jqw2009 | 园豆:2439 (老鸟四级) | 2019-08-05 08:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册