我正在开发MFC C++中的Autocad/Bricscad对话框。我发现了一个更大的问题。有一个对话框为“特殊”绘图对象设置元数据。我用这个对话框(在一个循环中)更新每个“特殊”绘图对象的数据。因此,如果您有十个“特殊”绘图对象,相同的对话框将打开十次(依次)。现在,我遇到了一个问题,用户有时双击"OK"-Button。但是,如果双击足够快,则该对话框下一个实例的"OK"-Button将自动单击。我试了很多次(例如,如果点击按钮就禁用它),但是没有解决我的问题。也许你们中有人有个好主意。
向你问好,西蒙
发布于 2015-07-27 12:49:36
打开新对话框时,可以在进入正常消息循环之前刷新鼠标单击消息的消息队列,例如:
MSG msg;
while (PeekMessage(&msg, hWndDlg, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE));
发布于 2015-07-28 07:09:09
我试着扩展乔纳森·波特的答案。
当您打开一个新对话框并调用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秒并不昂贵,也不烦人。
https://stackoverflow.com/questions/31653383
复制相似问题