CSkin博客

标题: 【水印文本框】C#WinForm给控件加入水印文字 [打印本页]

作者: 乔克斯    时间: 2014-9-20 00:42
标题: 【水印文本框】C#WinForm给控件加入水印文字
C#WinForm给控件加入水印文字

说明与效果图:
今天突然来了一个这样的需求,需要在C#的编辑框上加入一个Hint水印效果,类似如下图:

以前在手机上(wp)上做过类似的效果。参考silverlight toolkit 的searchTextBox。
现在要在winform下制作,开始我还以为应该有啥啥属性可以一键搞定,结果目测了一下,没有什么属性,于是乎百度了一下,网上说用win32API来做,这倒挺神奇的,参考别人做了如下列子。
申明一个Win32Utility类,静态的。

代码如下:
[C#] 纯文本查看 复制代码
public static class Win32Utility
{

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern Int32 SendMessage(IntPtr hWnd, int msg,
int wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);

[DllImport("user32.dll")]
private static extern bool SendMessage(IntPtr hwnd, int msg, int wParam, StringBuilder lParam);

[DllImport("user32.dll")]
private static extern bool GetComboBoxInfo(IntPtr hwnd, ref COMBOBOXINFO pcbi);

[StructLayout(LayoutKind.Sequential)]
private struct COMBOBOXINFO
{
public int cbSize;
public RECT rcItem;
public RECT rcButton;
public IntPtr stateButton;
public IntPtr hwndCombo;
public IntPtr hwndItem;
public IntPtr hwndList;
}

[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}

private const int EM_SETCUEBANNER = 0x1501;
private const int EM_GETCUEBANNER = 0x1502;

public static void SetCueText(Control control, string text)
{
if (control is ComboBox)
{
COMBOBOXINFO info = GetComboBoxInfo(control);
SendMessage(info.hwndItem, EM_SETCUEBANNER, 0, text);
}
else
{
SendMessage(control.Handle, EM_SETCUEBANNER, 0, text);
}
}

private static COMBOBOXINFO GetComboBoxInfo(Control control)
{
COMBOBOXINFO info = new COMBOBOXINFO();
//a combobox is made up of three controls, a button, a list and textbox;
//we want the textbox
info.cbSize = Marshal.SizeOf(info);
GetComboBoxInfo(control.Handle, ref info);
return info;
}

public static string GetCueText(Control control)
{
StringBuilder builder = new StringBuilder();
if (control is ComboBox)
{
COMBOBOXINFO info = new COMBOBOXINFO();
//a combobox is made up of two controls, a list and textbox;
//we want the textbox
info.cbSize = Marshal.SizeOf(info);
GetComboBoxInfo(control.Handle, ref info);
SendMessage(info.hwndItem, EM_GETCUEBANNER, 0, builder);
}
else
{
SendMessage(control.Handle, EM_GETCUEBANNER, 0, builder);
}
return builder.ToString();
}

}

然后在程序里这样调用即可。实现超简单… (本文章无源码,需要使用直接拷贝如上代码即可)


作者: HJL    时间: 2014-11-13 15:02
好文章!谢谢楼主,代码很实用。
作者: lansiyao    时间: 2014-11-15 15:06
看起来不错,不过也可以用GDI+来实现水印的效果
作者: little_kiss    时间: 2014-11-18 11:29
非常感谢分享!~~
作者: i9527    时间: 2014-12-8 14:58
轻轻来,轻轻走,你看不见我
作者: slljlzw    时间: 2015-1-13 11:33
谢谢楼主的分享
作者: silverlight    时间: 2015-11-12 15:33
实用啊 之前从没做过类似效果 ...
作者: suver    时间: 2016-1-21 15:09
牛,C#也可以做成这样呀·· 以前都是使用点击事件清除掉~
作者: chinasmu    时间: 2016-5-2 00:16
之前从没做过类似效果 ...
作者: vanze    时间: 2016-5-15 11:26

作者: 310939468    时间: 2016-5-19 16:04
谢谢分享
作者: 279108435    时间: 2016-6-13 14:25
以前都是使用点击事件清除掉
作者: lkjlkjhong    时间: 2016-7-13 10:41
谢谢分享,支持了
作者: jxs10647    时间: 2016-8-29 17:28
为什么 我这里总是提示 为将对象设置实例
作者: bruce301    时间: 2016-9-14 16:26
测试了不行,有什么要注意的吗?
作者: 梦玄庭    时间: 2016-9-25 17:48
试了,没效果啊,需要注意什么吗?textbox的属性?
作者: yinghao2005    时间: 2016-10-10 14:26
强学习了...
作者: iamlonelystar    时间: 2016-10-21 15:14
好文章!谢谢楼主
作者: iamlonelystar    时间: 2016-10-21 15:15
好文章!谢谢楼主
作者: esf5021314    时间: 2016-10-21 15:30
谢谢楼猪分享,楼猪辛苦了~
作者: 小口田    时间: 2017-2-21 13:06
感谢分享。
作者: chn0000000    时间: 2017-2-21 21:51
复合物后和人格让我会更好
作者: Summer大大    时间: 2017-3-1 19:19
[C#] 纯文本查看 复制代码
public String WaterText { get; set; }
        private void textBox1_Enter(object sender, EventArgs e)
        {
            if (textBox1.Text == WaterText || textBox1.Text == "")
            {
                textBox1.Text = "";
                textBox1.ForeColor = Color.Black;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            WaterText = "要设置的水印文字";
            textBox1.Text = WaterText;
            textBox1.ForeColor = Color.Gray;
        }

        private void textBox1_Leave(object sender, EventArgs e)
        {
            if (textBox1.Text == "" || textBox1.Text == WaterText)
            {
                textBox1.Text = WaterText;
                textBox1.ForeColor = Color.Gray;
            }
        }





欢迎光临 CSkin博客 (http://bbs.cskin.net/) Powered by Discuz! X3.2