Я занимаюсь разработкой Autocad / Bricscad-Dialogs в MFC C ++. Знай, я обнаружил большую проблему. Существует диалог, который устанавливает метаданные для «специальных» объектов рисования. Я обновляю данные каждого «специального» объекта рисования с помощью этого диалога (в цикле). Таким образом, если у вас есть десять «специальных» объектов рисования, один и тот же диалог открывается десять раз (последовательно). Теперь у меня проблема в том, что пользователь иногда делает двойной щелчок на кнопке «ОК». Но если этот двойной щелчок достаточно быстр, кнопка «ОК» следующего экземпляра этого диалогового окна будет нажата автоматически. Я много пытался (например, отключить кнопку, если она была нажата), но ничего не решило мою проблему. Может, у кого-то из вас есть хорошая идея.
С наилучшими пожеланиями,
Саймон
Когда вы открываете новое диалоговое окно, вы можете очистить очередь сообщений от щелчков мышью, прежде чем перейти в обычный цикл обработки сообщений, например:
MSG msg;
while (PeekMessage(&msg, hWndDlg, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE));
Я пытаюсь расширить ответ Джонатана Поттера.
Когда вы открываете новое диалоговое окно и вызывается 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 секунды при запуске следующего диалога не дорогая и не раздражающая.