Запрет двойного нажатия на кнопку MFC-Dialog

Я занимаюсь разработкой Autocad / Bricscad-Dialogs в MFC C ++. Знай, я обнаружил большую проблему. Существует диалог, который устанавливает метаданные для «специальных» объектов рисования. Я обновляю данные каждого «специального» объекта рисования с помощью этого диалога (в цикле). Таким образом, если у вас есть десять «специальных» объектов рисования, один и тот же диалог открывается десять раз (последовательно). Теперь у меня проблема в том, что пользователь иногда делает двойной щелчок на кнопке «ОК». Но если этот двойной щелчок достаточно быстр, кнопка «ОК» следующего экземпляра этого диалогового окна будет нажата автоматически. Я много пытался (например, отключить кнопку, если она была нажата), но ничего не решило мою проблему. Может, у кого-то из вас есть хорошая идея.

С наилучшими пожеланиями,
Саймон

1

Решение

Когда вы открываете новое диалоговое окно, вы можете очистить очередь сообщений от щелчков мышью, прежде чем перейти в обычный цикл обработки сообщений, например:

MSG msg;
while (PeekMessage(&msg, hWndDlg, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE));
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 секунды при запуске следующего диалога не дорогая и не раздражающая.

1

По вопросам рекламы [email protected]