本文假定您已具有.NET WinForm控件的开发经验和Windows消息处理的基本知识。

使用Vista的用户都知道,在登录时输入用户名和密码的文本框都具有水印效果,在文本框里没有文字时,分别会以灰色显示“用户名”和“密码”,当输入内容以后这些说明文字就消失了。

由于目前手头上在开发的一个软件需要用到这样的功能,因此对水印的效果做了一些研究。很明显,水印的文字并不是真正的文字内容(也就是TextBox.Text属性),而是使用GDI绘制在TextBox控件表面上的图形。水印的实现并不复杂,创建一个类继承TextBox,当TextBox需要绘制时,先由TextBox完成自身的绘制,再根据当前TextBox中是否有内容来确定是否要绘制水印文本。

什么时候需要绘制呢,有过控件开发经验的人都知道,一般是在TextBox的Paint事件(OnPaint方法)里放入绘制水印文字的代码,但很快被否决,因为TextBox根本不会引发Paint事件。道理很简单,TextBox是.net对原生的Windows控件EDIT进行了封装,所有的控件绘制都是由Windows自己完成的,在.net的代码里是无法介入的,除非使用SetStyle方法设置UserPaint为true。通过UserPaint可以由.net代码来完全绘制控件,当然就可以引发Paint事件,但这种做法有太多的东西要考虑太多,并不是我要研究的主要方向。

那么,要怎么样才能在无法使用Paint事件的情况下,知道何时应该绘制水印文本呢?很简单,Windows Message,消息,强大的消息。Control类提供了WndProc方法用于控件开发人员处理消息,只要重载这个方法,并判断是否为绘制控件的消息WM_PAINT,就可以知道什么时候应该绘制水印了。

OK,接下来就简单了,下面的代码演示了一个简单的水印效果的实现。

 

Code

 
在下一篇博文里,我将会再说明如何在ComboBox控件中绘制水印,敬请期待。

posted on 2009-08-19 20:46  一风  阅读(1427)  评论(10编辑  收藏  举报