作者: 乔克斯
查看: 12712|回复: 22
打印 上一主题 下一主题

[源码] 【水印文本框】C#WinForm给控件加入水印文字

[复制链接]
跳转到指定楼层
楼主
乔克斯 发表于 2014-9-20 00:42:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
查看: 12712|回复: 22
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();
}

}

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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 转播转播
回复 论坛版权

使用道具 举报

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

使用道具 举报

您需要登录后才可以回帖 登录 | 加入CSkin博客

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|CSkin ( 粤ICP备13070794号

Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.  Designed by ARTERY.cn
GMT+8, 2024-11-23 10:46, Processed in 0.598376 second(s), 32 queries , Gzip On.

快速回复 返回顶部 返回列表