zoukankan      html  css  js  c++  java
  • 在TextBox上实现水印效果(WinForms)

    本文假定您已具有.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控件中绘制水印,敬请期待。

  • 相关阅读:
    【LeetCode】204
    【LeetCode】231
    【LeetCode】58
    解决error104 socket error问题
    爬虫问题
    80端口被system占用的问题
    Linux命令行下批量重命名文件名为数字索引编号(0~N.xxx)的方法
    [转]利用excel进行线性规划求解
    python——时间与时间戳之间的转换
    最全中文停用词表整理(1893个)
  • 原文地址:https://www.cnblogs.com/effun/p/1550166.html
Copyright © 2011-2022 走看看