如何在 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 的功能区文本框中实现数据验证的主要内容,如果未能解决你的问题,请参考以下文章

vue中实现中,自动补全功能

如何在 Win32 窗口中实现 MFC 资源?

如何在黑莓中实现搜索功能?

如何在 PHP CodeIgniter 中保存文本框中输入的数据

SpringBoot+Vue项目中实现登录验证码校验

MFC CListCtrl 更新任何单元格的文本