您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:104 来源:vckbase.com

本文章共8437字,分6页,当前第5页,快速翻页:
 

  我提到的反馈窗口,它由 CRegexForm 全权管理;你只需通过调用 CRegexForm::SetFeedBackWindow 提供一个这样的窗口即可。你可以为出错信息指定一种颜色。CRegexForm 还负责提示功能。默认情况下,当用户tab到某个新输入域时显示域提示(如图 Figure 1)。你可以调用 CRegexForm::SetShowHints(FALSE)来关闭提示功能。SetShowHints(TRUE, nDelay, nTimeout) 可以再次打开提示功能,这里 nDelay 是显示提示之前要等待的毫秒数(默认值=250),nTimeout 是提示显示的毫秒数(默认值=0,表示一直显示)。当用户离开输入域时(EN_KILLFOCUS),CRegexForm 自动清除其提示。TestForm 使用 SetShowHints 实现复选框提示的开启和关闭(参见 Figure 1)。
逆风编程技术
  还有另外一个特性是否提出来我有些举棋不定。CRegexForm 有一个选项来做立即验证。我不建议使用它,因为我觉得那是一种不好的GUI设计,但很多时候在没有输入有效的信息之前你不想让用户tab到下一个输入域。在这种情况下,你可以在域映射中使用 RGXF_IMMED,或调用 SetValidateImmed 来使所有域都进行立即验证。TestForm 有一个复选框专门控制立即验证功能的开关。如果选中,你会看到为什么立即验证不是个好主意。
  最后,看看最小/最大和字符限制约束特性?最小/最大是正则表达式无法做到的一件事。虽然“.{0,35}”是一个描述最多35个字符长的字符串正则表达式,但你还是愿意使用 EM_LIMITTEXT 来限制编辑控制的文本长度,所以当用户敲入过长的字符时发出蜂鸣声。因为我容忍实现了一个窗体验证系统,但它缺乏 MFC 已经支持的特性,我引进了“伪正则表达式”的概念。例如,IDC_AGE 的正则表达式(Age 输入域)为“rgx:minmax:int:1:120,maxchars:3”。显然,它不是一个真正的正则表达式。它是一个伪表达式,它由 CRegexForm 自己来识别和解释。其一般格式是:“rgx:expr,expr,..expr”,这里每个表达式描述不同的约束。目前支持两种类型:“minmax:type:minval:maxval”(此处 type 是 int 或 double)以及“maxchars:maxval”。CRegexForm 负责做专门解析,并对 maxchars 使用 EM_LIMITTEXT,就像 DDV_MinMaxInt 一样。具体实现细节请下载源代码。至于资源子串,正则表达式解析它们简直是小菜一碟。
  CRegexForm 所能做的事情我已经说完了。它是如何工作的呢?由于篇幅所限,恕不赘言,但我大概勾勒一下。CRegexForm 我的 CSubclassWnd 来子类化对话框。对之前不了解它的读者来说,CSubclassWnd 是我很早以前写的一个类,它使用Windows的子类化机制来截获发送到另一个窗口的消息。CSubclassWnd 真正酷的地方是它不需要在你的类层次中插入新类便能让你子类某个 MFC 窗口。我可以从 CDialog 派生出 CRegexForm,但那样你就得从 CRegexForm 派生自己的对话框。那么如果你已经自己实现了从 CDialog 派生的 CBetterDialog 怎么办呢?此时,你不得不进行外科手术来插入 CRegexForm,结果将不可预见。
  这是MFC的一大缺陷:它用派生实现子类化,所以类层次确切地反映了 Windows 子类机制。但没必要这样,编写像 CRegexForm 这样的插件类来子类化你的对话框而不用改动你的类层次是更好的解决方法。对我来说,CSubclassWnd 是如此不可或缺,没有它我无法编程!
  CRegexForm 使用 CSubclassWnd 截获 EN_KILLFOCUS 和 EN_SETFOCUS 以隐藏和显示提示,截获 EN_CHANGE 以便用户敲入任何信息后清除输入域的出错状态。CRegexForm 用我的 CPopupText 类实现本身的提示,CPopupText 类第一次讨论是在 2000年九月的专栏。为了防止用户敲入不允许的字符,CRegexForm 为每一个具有 LegalChars 正则表达式的编辑控制安装了另一个 CSubclassWnd 派生的钩子。这是一个嵌套类,CRegexForm::CEditHook 截获发送到编辑控制的 WM_CHAR 消息,它吃掉任何非法输入字符并发出蜂鸣。详情参见 RegexWrap 的源代码,这个代码你可以从本期中我的另外一篇文章中下载:“
 
本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 5 - 6 - 下一页>>
相关文章

如何在NT下获取进程的路径(增补)
高效开发与彻底测试
对话框模板,RegexTest
在MDI程序中实现类似WPS2000的文件切换标签
用DirectShow抓取影片帧
用微软的实时通信API集成丰富的客户端通信
盗QQ,我也会
对《一个完善的ODBC数据库程序》一文的补充
Python 的数据库操作
类似 MSN 信息发送框的制作(上)
对《一个简单的学生成绩管理系统》优化的一
深入浅出 CPropertySheet
实现类似Excel和Visual C 里文件夹式样的标
利用OpenGL实现动画效果
一个简单的时钟程序
一个完善的ODBC数据库程序
如何定制浮动工具条
一步步制作真彩工具条
自动查找并删除VC生成的临时文件
在VC中调用 WebService (非托管)

相关评论


本文章所属分类:首页 VC++

  热门关键字: