防止双击 MFC-Dialog 按钮

Prevent double click on MFC-Dialog button

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

此致, 西蒙

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

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

我尝试扩展 Jonathan Potter 的答案。

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

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

PeekMessage 的技巧会奏效,问题是您需要 运行 循环,只要 "double click" 就可以。如果点击的距离为 1/10 秒,则需要删除这段时间内的所有鼠标点击。

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

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