zoukankan      html  css  js  c++  java
  • 水印管理器:1、设计思路(无图无代码慎入)

    水印是什么东西?虽然先前发的几篇随笔都在说水印,但却没有很直接地说明这个问题。 其实我也说不准,简单的说,就是显示在输入框控件(TextBox)上的一段灰色文字,当控件获取焦点或开始输入文字时,这段灰色文字就自动消失。它的主要功能是给使用者一些比较简单的提示。老外的喜欢把这种东西称为Cue,中文意思是线索。不管叫什么,它们都达到了相同的目的,就是增加用户体验,为用户提供方便。 好了,废话不多说,下面切入正题。

    在先前的3篇随笔中,我主要说明了实现水印的一些基本原理,对控件开发有一定的经验的人应该比较容易明白,但同时可能会有这样一些疑惑:
    * 简单的水印功能实现并不复杂,如果没有太多要求的话只要一条语句就可以实现,何必这么麻烦去继承一个控件来实现呢;
    * 况且如果想要在TextBox派生出一个适合自己应用要求的类,岂不是要从WatermarkTextBox继承,这样的做法有点怪怪的;
    * 还有一点,如果要现有已经开发好的程序中应用水印功能,必须要替换掉原来所使用的控件,这可是一件可大可小的事啊。

    那么,是不是有一种办法可以在不修改现有控件的基础上,实现水印的功能呢?答案是肯定的,有两种方法可供参考。
    第一种,简称为Win32,这个最简单,就是直接使用Windows API函数,通过SendMessage发送EM_SETCUEBANNER设置水印,可以最简单的完成这个目的。在上一篇随笔中我提到的老外的那个CueProvider就是这样做的,关于这种方法的利弊我就不再多说了,有兴趣可以去把老外的源码下载来看看。
    第二种,就是发扬DIY精神,完全自己做。因为是要在控件的外部来抓取控件的消息,那就需要动点脑筋。不卖关子,直接了当,可以运用IMessageFilter接口和Application.AddMessageFilter方法向应用程序添加一个消息过滤器,这样就可以在当前应用程序的任何一个窗口获取消息前拦截我们想要的WM_PAINT消息,再进行水印的处理。

    好了,实现方法有了,还有什么要考虑的呢?先取个名字吧,就叫水印管理器好了,它是负责在窗体上管理各个控件水印的一个组件,注意啦,是组件啊,不是控件。当然啦,作为控件开发人员,良好的设计时支持也是很重要的。象这样的组件,如果没有设计时的支持,就非常不直观,还要写一堆代码。那么,怎么样的设计时支持比较好呢?用过ToolTip组件的人都知道,设计时在窗体上放了一个ToolTip以后,在这个窗体各个控件的属性窗口里会多出一个属性“toolTip1上的ToolTip”,如果水印管理器的设计时也可以实现类似的功能,那就很棒了。经过小小的研究,发现原来使用IExtenderProvider配合ProviderPropertyAttribute就可以了,非常简单。

    文章到此为止,已经把整个组件的设计思路说了差不多清楚了,接下来就是动手时间。

    (未完待续)
  • 相关阅读:
    Django之templates模板
    Django视图函数之request请求与response响应对象
    Django视图函数之三种响应模式
    Django视图函数函数之视图装饰器
    django 获取request请求对象及response响应对象中的各种属性值
    Django 项目中设置缓存
    python 中 使用sys模块 获取运行脚本时在命令行输入的参数
    Mac 设置终端中使用 sublime 打开文件
    iterm2 恢复默认设置
    Python replace方法的使用
  • 原文地址:https://www.cnblogs.com/effun/p/1551044.html
Copyright © 2011-2022 走看看