【问题标题】:Prevent double click on MFC-Dialog button防止双击 MFC-Dialog 按钮
【发布时间】:2015-10-17 15:44:21
【问题描述】:

我正在使用 MFC C++ 开发 Autocad/Bricscad-Dialogs。知道我发现了一个更大的问题。有一个对话框为“特殊”绘图对象设置元数据。我用这个对话框(在一个循环中)更新每个“特殊”绘图对象的数据。因此,如果您有十个“特殊”绘图对象,同一个对话框将打开十次(连续)。现在我遇到的问题是用户有时会双击“确定”按钮。但是如果这个双击足够快,这个对话框的下一个实例的“确定”按钮将自动点击。我尝试了很多(例如,如果单击按钮则禁用该按钮),但没有解决我的问题。也许你们中的某个人有一个好主意。

最好的问候, 西蒙

【问题讨论】:

    标签: c++ mfc dialog event-handling double-click


    【解决方案1】:

    当您打开一个新对话框时,您可以在进入正常消息循环之前刷新鼠标单击消息的消息队列,例如:

    MSG msg;
    while (PeekMessage(&msg, hWndDlg, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE));
    

    【讨论】:

    • 也许我不明白你的意思,但我没有对话框的“自己的”消息循环。对于每个对话框/绘图对象,我只有一个带有 .DoModal() 调用的循环。
    • 不管你有没有自己的消息循环,都照 Jonathan Potter 说的去做。
    • 您的对话框的消息循环在 MFC 代码中。将 Jonathan Potter 的建议放在对话框的 OnInitDialog 中应该可以解决问题。
    • 好的,我有它,但它在 OnInitDialog 中不起作用。我在构造函数中尝试了它,现在它完美无缺。谢谢!
    • 好的,还不行。如果我调试它,它可以正常工作,但如果我在没有调试器的情况下尝试它,它就不起作用。我讨厌这个...
    【解决方案2】:

    我尝试扩展乔纳森·波特的答案。

    当您打开一个新对话框并调用 OnInitDIalog 时,只需从队列中删除鼠标消息并等待 1/10 秒。

    MSG msg;
    DWORD dwStart = ::GetTickCount():
    while (PeekMessage(&msg, hWndDlg, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE)!=0 ||
           (::GetTickCount() - dwStart) < 100))
          ;
    

    PeekMessage 的技巧会起作用,问题是只要“双击”就需要运行循环。如果点击的距离为 1/10 秒,您需要移除这段时间内的所有鼠标点击。

    而且 OnInitDialog 也是正确的位置。您可以将此刷新扩展到所有鼠标消息 WM_MOUSEFIRST/WM_MOUSELAST... 以获得所有点击。

    启动下一个对话框时 1/10 秒的延迟并不昂贵或烦人。

    【讨论】:

    • 感谢您的输入,但我以其他方式执行此操作:在 OnInitDialog() 方法中,我从未收到鼠标单击事件。现在我在 EndDialog() 方法之前从 Jonathan 调用代码。我删除了所有鼠标单击事件。现在它工作正常!感谢您的帮助。
    • 请记住,执行 EndDialog 时,第二次点击可能不在队列中!这是主要问题。我对这样的构造也有类似的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-10-01
    • 2018-06-14
    • 2010-09-08
    • 2022-01-21
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多