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






4.79/5 (68投票s)
过滤输入文本的决定性方法。包括可配置的错误显示。
引言
自从计算机发明以来,数据验证一直是一个重要的问题。在用户界面方面,验证数据的最快方法是在输入时进行。奇怪的是,没有标准的 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
中添加了 boostposix_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
,以便可以使用不同类型的验证器。SRegexValidator
和SGrammarValidator
被演示控件使用。
- 引入了接口
- 1.0.5.9 - 2022 年 9 月 6 日
- 将 FilterEdit 制作成 DLL。引入了
CRegexEdit
并将CBaseEdit
重命名为CFilterEdit
。
- 将 FilterEdit 制作成 DLL。引入了
- 1.0.6.0 - 2023 年 1 月 21 日
- 更新到最新的 parsertl 库。
- 1.0.6.1 - 2024 年 2 月 15 日
- 更新为使用 lexertl17 和 parsertl17