WindowsForm实现TextBox占位符Placeholder提示功能
作者:zhuanghamiao 时间:2023-03-18 12:57:44
在WinForm程序中,实现TextBox文本输入框占位符的方式也很多,最常用的是方式基于Windows Api SendMessage函数发送EM_SETCUEBANNER消息,或者通过TextBox自带的焦点事件处理。
SendMessage函数实现
创建一个继承TextBox的ZhmTextBox输入框控件,新增Placeholder属性,在Placeholder的set方法中发送EM_SETCUEBANNER消息
public class ZhmTextBox: TextBox
{
private const int EM_SETCUEBANNER = 0x1501;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern Int32 SendMessage(IntPtr hWnd, int msg, int wParam, [MarshalAs(UnmanagedType.LPWStr)]string lParam);
private string placeholder = string.Empty;
public string Placeholder
{
get { return placeholder; }
set
{
placeholder = value;
SendMessage(Handle, EM_SETCUEBANNER, 0, Placeholder);
}
}
}
重新编译下项目,就可以在工具箱中找到ZhmTextBox控件,然后设置ZhmTextBox的Placeholder属性
通过TextBox的GotFocus和LostFocus事件
不知道为啥微软要将TextBox的这两个事件标注Browsable为false,所以在VS的属性面板中是找不到这两个事件的,只能手动撸了。
private void Form1_Load(object sender, EventArgs e)
{
textBox1.Text = "此处是一些提示内容...";
textBox1.LostFocus += TextBox1_LostFocus;
textBox1.GotFocus += TextBox1_GotFocus;
}
private void TextBox1_GotFocus(object sender, EventArgs e)
{
textBox1.Text = "";
}
private void TextBox1_LostFocus(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(textBox1.Text))
textBox1.Text = "此处是一些提示内容...";
}
如果针对每个控件都这样撸还是有些麻烦,可以扩展下TextBox类,把事件处理放在子类的构造中去调用,这样使用的时候也比较省事。具体代码就不写了,有兴趣的可以自己去实现。
来源:https://www.cnblogs.com/zhuanghamiao/archive/2020/07/12/TextBox-Placeholder.html
标签:TextBox,占位符,Placeholder
0
投稿
猜你喜欢
SpringMVC文件上传原理及实现过程解析
2021-09-03 00:24:25
解决java启动时报线程占用报错:Exception in thread “Thread-14“ java.net.BindException: Address already in use: bind
2021-07-05 04:26:23
App内切换语言详解
2023-04-12 11:21:44
Java实现微信发红包
2021-07-22 05:11:07
从try-with-resources到ThreadLocal,优化你的代码编写方式
2023-11-11 03:19:52
Android使用AIDL方式实现播放音乐案例
2022-01-04 23:58:40
使用SpringMVC响应json格式返回的结果类型
2022-06-29 20:29:46
.NET C#利用ZXing生成、识别二维码/条形码
2022-03-25 12:20:45
java多线程有序读取同一个文件
2022-05-28 20:41:57
一文了解自定义MVC框架实现
2023-01-11 00:15:10
Android Studio编写AIDL文件后如何实现自动编译生成
2022-01-25 16:44:38
flutter实现发送验证码功能
2023-07-05 19:03:12
详解Spring Boot 定制HTTP消息转换器
2023-11-24 20:20:51
spring注解之@Valid和@Validated的区分总结
2023-11-01 07:51:42
基于hibernate框架在eclipse下的配置方法(必看篇)
2022-11-09 20:30:26
Java 用Prometheus搭建实时监控系统过程详解
2023-09-06 12:07:40
关于C#调用C++dll传指针释放内存问题
2021-12-20 06:56:34
Docker 存储驱动详细介绍
2023-12-21 03:18:34
C语言实现四窗口聊天
2021-12-28 01:02:12
C#编程实现QQ界面的方法
2023-02-05 23:35:45