65.9K
CodeProject 正在变化。 阅读更多。
Home

CFilterEdit: 使用正则表达式过滤您的输入

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (68投票s)

2004年7月30日

CPOL

5分钟阅读

viewsIcon

457205

downloadIcon

9207

过滤输入文本的决定性方法。包括可配置的错误显示。

Screenshot - FilterEdit.png

引言

自从计算机发明以来,数据验证一直是一个重要的问题。在用户界面方面,验证数据的最快方法是在输入时进行。奇怪的是,没有标准的 Windows 编辑控件能够处理任何类型的数据。

这个验证编辑控件旨在提供终极的数据验证框架,无论您尝试输入的數據有多复杂。

设计决策

  • 验证必须清晰可靠
  • 该控件应像 CEdit 一样易于使用
  • 标准将只包含少数视觉效果
  • 'WM_KILLFOCUS 是字段验证错误的执行时机'
  • 自动格式化应该很容易从派生类中添加
  • FilterEdit 必须尽可能简单,不要变得臃肿!

拦截的 Windows 消息

以下 Windows 消息被捕获用于验证目的

  • EM_REPLACESEL
  • WM_CLEAR
  • WM_CHAR
  • WM_CUT
  • WM_KEYDOWN
  • WM_KEYUP
  • WM_KILLFOCUS
  • WM_PASTE
  • WM_SETFOCUS
  • WM_SETTEXT

… 这些消息被捕获以执行视觉效果

  • WM_CTLCOLOR
  • WM_PAINT

用于验证的 Windows 消息重载

CBaseEdit::OnChar

WM_CHAR 是为 Windows 编写的每个验证编辑控件都必须捕获的 Windows 消息。在这里,可以检查单个字符是否被控件接受。

CBaseEdit::OnKeyDown

WM_KEYDOWN 是捕获 Delete 键、Ctrl-X、Ctrl-C 和 Ctrl-V 的地方。

CBaseEdit::OnKillFocus

同样,WM_KILLFOCUS 是一个非常常用的捕获消息。然而,与其在输入不完整时尝试将焦点设置回控件,我们只是标记错误并允许焦点正常切换。

CBaseEdit::OnSetFocus

捕获 WM_SETFOCUS 只是为了设置我们需要的任何颜色并在需要时显示工具提示。

CBaseEdit::WindowProc

这是处理我们感兴趣的其他 Windows 消息的地方。

如何派生您自己的自定义控件

您可能想做的四件显而易见的事情是

  • 重载 SemanticCheck

    请参阅 CUIntRangeEdit 示例,了解其工作原理。

  • 自行捕获 WM_CHAR

    通过自行捕获字符,您可以在用户键入时自动格式化输入并执行语义验证。请参阅 CDateTimeEdit 示例,了解其工作原理。

  • 自行捕获 WM_KILLFOCUS

    当用户离开控件时,您可能希望执行额外的格式化。同样,请参阅 CDateTimeEdit 示例。如果这样做,请不要忘记调用 CBaseEdit::OnKillFocus

  • 重载 SyntaxCheck

    这是如果您想在运行语法检查之前预处理 string。请参阅 CDateTimeEdit 示例。

ZIP 中包含的示例控件

  • CCurrencyEdit
  • CDateTimeEdit
  • CFloatEdit
  • CIntEdit
  • CUIntEdit
  • CUIntRangeEdit
  • CSpin

工具提示支持

您可能希望在运行时解释控件的数据格式。因此,包括了气球帮助支持。要包含此支持,您必须调用 CreateToolTip

BOOL CEditTestDlg::OnInitDialog()
{
    CDialog::OnInitDialog ();
    ...
    m_DateEdit.CreateToolTip (this, _T("Tooltip text here"));
    ...
}

C++ 标准正则表达式库

boost::regex 库已被接受为 C++ 标准库的一部分。由于其部分匹配支持,该库也理想适用于此控件。在此处 获取 Boost 库

待办事项

  • 添加更多演示控件
  • 派生控件的教程

反馈

非常欢迎所有反馈!

修订历史

  • 1.0.0.0 - 2004 年 7 月 30 日
    • 发布了原始版本
  • 1.0.3.5 - 2007 年 8 月 8 日
    • 错误修复:现在在 CBaseEdit::OnKeyDown() 中使用 GetKeyState()
  • 1.0.3.6 - 2007 年 8 月 22 日
    • 现在允许用户删除编辑控件的全部内容,无论正则表达式如何
  • 1.0.3.7 - 2008 年 1 月 14 日
    • 更改了 CDateEdit - 现在是 CDateTimeEdit
  • 1.0.3.8 - 2008 年 2 月 25 日
    • 修复了双重粘贴错误
  • 1.0.3.9 - 2008 年 6 月 13 日
    • CDateTimeEdit 中添加了 bool CDateTimeEdit::GetTimeStamp (SQL_TIMESTAMP_STRUCT *pTS)
    • CBaseEdit::ValidateChar() 中过滤掉 Ctrl-X、Ctrl-C 和 Ctrl-V
  • 1.0.4.0 - 2008 年 8 月 8 日
    • 在编辑控件的最底部显示工具提示,以避免绘制覆盖旋转控件边框!
  • 1.0.4.1 - 2008 年 9 月 15 日
    • 使用系统颜色作为默认值,支持 boost::gregorian::date
  • 1.0.4.2 - 2008 年 10 月 15 日
    • CDateTimeEdit 的动态日历对话框和位图(现在不需要资源文件条目)
  • 1.0.4.3 - 2008 年 11 月 7 日
    • 修复了 CDateTimeEdit::WindowProc 中的断言
  • 1.0.4.4 - 2008 年 12 月 5 日
    • CDateTimeEdit 中添加了 boost posix_time 支持
  • 1.0.4.5 - 2009 年 1 月 9 日
    • 允许 WM_SETTEXT 设置空字符串,即使正则表达式禁止
  • 1.0.4.6 - 2009 年 5 月 1 日
    • 日期/时间 Get 函数的接口更改
  • 1.0.4.7 - 2009 年 9 月 7 日
    • CDateTimeEdit::SyntaxCheck 的错误修复
  • 1.0.4.8 - 2010 年 5 月 19 日
    • FloatEdit 添加了无符号支持
  • 1.0.5.0 - 2010 年 10 月 7 日
    • 此版本扩展了 CFloatEdit,以便您可以指定整数部分的位数
  • 1.0.5.1 - 2010 年 10 月 25 日
    • 此版本修复了 CDateTimeEdit::SetTime() 中的错误
  • 1.0.5.2 - 2011 年 1 月 26 日
    • 此版本为时间添加了 HHMM 模式
  • 1.0.5.3 - 2011 年 2 月 17 日
    • 此版本为 CDateTimeEdit 中的日历按钮添加了 BS_DEFPUSHBUTTON 样式
  • 1.0.5.4 - 2011 年 2 月 21 日
    • 更改了 CDateTimEdit 中日期 get/set 函数的日期顺序,以使其与 COleDateTime 一致
  • 1.0.5.5 - 2011 年 4 月 8 日
    • 此更新修复了 CDateTimeEdit::SetTime() 中的范围检查
  • 1.0.5.6 - 2011 年 9 月 12 日
    • 此版本为 CDateTimeEdit 添加了 SetMin()SetMax(),并修复了一些错误
  • 1.0.5.7 - 2011 年 10 月 3 日
    • 此版本修复了 CDateTimeEdit::SemanticCheck() 中的错误
  • 1.0.5.8 - 2022 年 9 月 4 日
    • 引入了接口 SValidator,以便可以使用不同类型的验证器。SRegexValidatorSGrammarValidator 被演示控件使用。
  • 1.0.5.9 - 2022 年 9 月 6 日
    • 将 FilterEdit 制作成 DLL。引入了 CRegexEdit 并将 CBaseEdit 重命名为 CFilterEdit
  • 1.0.6.0 - 2023 年 1 月 21 日
    • 更新到最新的 parsertl 库。
  • 1.0.6.1 - 2024 年 2 月 15 日
    • 更新为使用 lexertl17 和 parsertl17
© . All rights reserved.