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控件中绘制水印,敬请期待。

  • 相关阅读:
    [JSOI2007][BZOJ1031] 字符加密Cipher|后缀数组
    leetcode Flatten Binary Tree to Linked List
    leetcode Pascal's Triangle
    leetcode Triangle
    leetcode Valid Palindrome
    leetcode Word Ladder
    leetcode Longest Consecutive Sequence
    leetcode Sum Root to Leaf Numbers
    leetcode Clone Graph
    leetcode Evaluate Reverse Polish Notation
  • 原文地址:https://www.cnblogs.com/effun/p/1550166.html
Copyright © 2011-2022 走看看