当控件即将失去焦点时,是否会从C ++程序触发事件?

罗伯特·理查森

我正在尝试修复MFCCEdit控件中的验证错误当前,验证是在OnChange事件处理程序中执行的但这是行不通的,因为它会在用户完成输入之前验证数据

因此,我正在尝试在OnKillFocus事件处理程序中进行验证如果验证失败,则GotoDlgCtrl()可以将焦点返回到包含无效数据的编辑框。当我调用时GotoDlgCtrl(),kill焦点事件再次触发,并且我处于无限循环中。

因此,我想处理一个事件,该事件在控件失去焦点之前就触发了,因此,如果我确定数据无效,则可以停止离开焦点,而是让用户输入正确的数据。

我知道我曾经在某个地方看到过Validating事件,但这可能是在.Net世界中。但是它提供了我正在寻找的功能。

安德鲁·特拉克(Andrew Truckle)

右键单击对话框资源,然后调用“类向导”:

类向导

接下来,转到“虚拟功能”选项卡,找到PreTranslateMessage并添加它:

虚函数

然后,您可以执行以下操作:

BOOL CTestDlgDlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_CHAR)
    {
        CWnd *pControl = GetDlgItem(IDC_EDIT1);
        if (pControl->GetSafeHwnd() == pMsg->hwnd)
        {
            if (pMsg->wParam == _TINT('!'))
            {
                AfxMessageBox(_T("Not allowed ! character"));
                return TRUE;
            }
        }
    }

    return CDialogEx::PreTranslateMessage(pMsg);
}

通常,控件是类型的成员变量,CEdit因此您可以与之进行比较m_edit.GetSafeHwnd()

结果:

结果

更新资料

我知道您说过:

但这是行不通的,因为它会在用户完成输入之前验证数据

您可以WM_KEYUP改用:

BOOL CTestDlgDlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYUP)
    {
        CWnd *pControl = GetDlgItem(IDC_EDIT1);
        if (pControl->GetSafeHwnd() == pMsg->hwnd)
        {
            CString str;
            GetDlgItemText(IDC_EDIT1, str);
            if (str.Find(_T("!")) >= 0)
            {
                AfxMessageBox(_T("Not allowed ! character"));
                return TRUE;
            }
        }
    }

    return CDialogEx::PreTranslateMessage(pMsg);
}

这将使您有机会在更新显示后进行验证。

另一种方法是自定义您的DoDataExchange处理程序。您可以在其中根据需要进行验证。然后在您的代码中简单测试UpdataData(TRUE)for的返回值FALSE

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

单击div时防止触发焦点事件

关闭HTML select元素时是否会触发DOM事件?

输入元素上的JavaScript更改事件仅在失去焦点时触发

在触发应用程序事件的同时创建bean时,如何避免在Spring中出现死锁?

如何触发焦点事件

事件触发时触发Promise

Change事件会触发jquery处理程序,但不会触发javascript处理程序

ElectronJS:从Alt + Tab选择中选择应用程序图标,会触发什么事件?

当表中的输入失去焦点时,如何触发“聚焦”事件?

触发事件以从Webbrowser控件托管WPF应用程序

Java:通过应用程序类打开游戏时,不会触发keyPressed事件

应用程序失去焦点事件

当应用程序从触发的Intent进入前景时,Flutter Capture事件

当用户在SwiftUI中停止长按手势时,如何触发事件处理程序?

在F#中触发时未调用C#事件处理程序

jQuery .autocomplete()select事件仅在小部件失去焦点时触发

$ destroy触发时,是否需要删除指令上的事件处理程序?

事件处理程序未在动态按钮单击时触发

仅在焦点元素失去焦点时才触发事件

选择开始时是否会触发js事件?

控件失去子控件时的捕获事件

当他的表单或应用程序接收到焦点并失去焦点时,如何使我的自定义控件得到通知?

如何附加以编程方式更改值时触发的JavaScript事件处理程序

Android上的Firebase-在需要时如何触发用于数据检索的事件处理程序?

仅当没有被任何处理程序阻止时才触发事件吗?

anglar 应用程序中的单击事件后父 div 设置为隐藏时,列表项单击事件不会触发

当您失去焦点时,transitionend 事件不会触发

C# 异步/等待外部事件处理程序触发

在浏览器中触发事件时,事件处理程序在什么时候确定?