我正在mfcc++中开发Autocad/brickscad - dialog。我发现了一个更大的问题。有一个对话框为"特殊"绘图对象设置元数据。我用这个对话框(在循环中)更新每个"特殊"绘图对象的数据。所以如果你有10个"特殊"的绘图对象,同样的对话框将打开10次(连续)。现在我有一个问题,用户有时会双击"确定"按钮。但是如果双击的速度足够快,下一个对话框实例的"OK"按钮会自动点击。我尝试了很多(例如禁用按钮,如果它被点击),但没有解决我的问题。也许你们中有人有好主意。
最诚挚的问候,西蒙。
当你打开一个新的对话框时,你可以在进入正常的消息循环之前刷新鼠标点击消息的消息队列,例如:
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的技巧将工作,问题是,你需要运行循环,只要"双击"将采取。如果点击的距离是1/10秒,你需要在这段时间内移除所有的鼠标点击。
并且OnInitDialog是正确的位置。你可以将这个刷新扩展到所有的鼠标消息WM_MOUSEFIRST/WM_MOUSELAST…获得所有点击
启动下一个对话框时的1/10秒延迟并不昂贵或令人讨厌。