如何在 MFC 的功能区文本框中实现数据验证
Posted
技术标签:
【中文标题】如何在 MFC 的功能区文本框中实现数据验证【英文标题】:How can I implement data validation in a ribbon textbox in MFC 【发布时间】:2015-10-19 17:21:45 【问题描述】:我正在更新旧应用以使用功能区。旧版本的一个地方有一个按钮,可以打开一个小对话框,从用户那里获取一个数值。我正在尝试使用CMFCRibbonEdit
将其替换为功能区上的文本框。我试图替换的对话框使用 DDX/DDV 来控制用户输入。由于功能区托管在CMainFrame
中,我想我只需要使用类向导将DoDataExchange
覆盖添加到主框架;然后从对话框中添加 DDX/DDV 代码的副本,然后更新数据成员/id/etc 值。但是,在这样做之后,当我对文本框的内容进行任何编辑或离开其焦点时,不会调用我的 DoDataExchange
方法,也不会强制执行输入值限制。
void CMainFrame::DoDataExchange(CDataExchange* pDX)
CFrameWndEx::DoDataExchange(pDX);
//AFX_DATA_MAP(CMainFrame)
DDX_Text(pDX, ID_CALIBRATE_USER_DEFINED_EDIT, m_CalDistance);
DDV_MinMaxInt(pDX, m_CalDistance, 0, 9999);
//AFX_DATA_MAP
【问题讨论】:
【参考方案1】:DoDataExchange/UpdateData 是 CWnd 中的一个虚函数,但它永远不会为 CFrameWnd 或 CToolBar 或 CMFCMfcRibbonBar 调用。
您可以简单地覆盖 CMFCRibbonRichEditCtrl::OnKillFocus 并在此处管理所有验证。但是你必须手动完成。
也许可以让 UpdateData 工作,但在这种情况下,您的功能区编辑控件的父级必须执行 UpdateData,否则找不到控件 ID。请记住,当我在功能区中输入内容时,我不会期待对话消息。我希望数据会自动更改为最小值或最大值。
【讨论】:
如果我要覆盖编辑控件中的方法,我需要做的不仅仅是 OnKillFocus。我需要摆弄一个在每次击键被处理之前触发的一个,以抛出任何非数字字符。CMFCRibbonRichEditCtrl
在 MSDN 中或多或少没有记录(基本上只是“不要搞砸”)所以我将如何找到我需要更改的内容;并且由于这不是我直接创建的东西,我将如何强制框架使用我的覆盖。我是否需要派生CMFCRibbonEdit' to host my modified
CMFCRibbonRichEditCtrl` 的自定义版本并在不使用设计器的情况下创建它们?
嗯,不。 WM_KILLFOCUS is the wrong time to do field validation.
我同意 IInspectable 与对话框。在单个控件中它是不同的。此外,我会更正信息并避免错误消息。对于更改事件,请在功能区编辑控件中使用 OnEditChange。以上是关于如何在 MFC 的功能区文本框中实现数据验证的主要内容,如果未能解决你的问题,请参考以下文章