Как предотвратить двойной щелчок по диалоговому окну Open File из регистрации щелчка на форме под ним?

У меня есть настраиваемый элемент управления, который по существу является холстом для рисования, и программой, которая использует его для редактирования файлов. Однако при открытии нового файла может произойти что-то очень странное.

Если пользователь дважды щелкает по файлу в диалоговом окне "Открыть файл" (стандартный TOpenDialog) вместо выбора элемента и удара ENTER, холст под ним регистрирует событие клика и заканчивает выполнение действия ничьей в положение курсора сразу после загрузки завершено.

Очевидно, для этого не предназначенное поведение. Я заметил, что, когда вы дважды щелкните мышью, сообщение с двойным щелчком появится перед вторым кликом. Я думаю, что диалоговое окно может закрываться от двойного щелчка, а затем появляется второе сообщение клика и отправляется туда, где есть соответствующие координаты, когда он ушел.

Можно ли каким-либо образом сделать эту остановку? Я не могу сказать свой код "после загрузки, просто съесть следующий клик", потому что его можно было бы открыть с помощью 'ENTER', а затем он пропустит первый законный клик. Может ли кто-нибудь подумать о лучшем способе справиться с этим? (Использование Windows 7, если это имеет значение.)

Ответ 1

Если есть сообщение "второе нажатие", там что-то не так. (Во-первых, Windows не имеет сообщений "click", просто сообщений мыши и мыши.) Двойной щелчок выглядит следующим образом: мышь вниз, мышь вверх, двойной щелчок, мышь вверх. Диалоговое окно исчезает между сообщением двойного щелчка и вторым сообщением мыши. Если ваш элемент управления получает сообщение с подсказкой и обрабатывает его как полный клик, тогда это объясняет проблему, и вам нужно остановиться; клик всегда представляет собой пару сообщений мыши и мыши. Если вы не получили оба, то это не щелчок.

Ответ 2

На самом деле, это второе событие мыши, которое было запущено в окне изображения, что приводит к вызову обработчика события. Это кажется ошибкой OpenFileDialog. Необходимо добавить проверку IsMouseCaptured для события мыши, одним нажатием мыши и мышью, а не только мышью.

Ответ 3

Я решил это так (это, конечно, обход):

    CFileDialog my_file_dialog(...);
    if ( my_file_dialog.DoModal()!=IDOK )
        return;

    CString fileName= my_file_dialog.GetPathName();

    //...

    CSelectItemsDlg dlg;


    // Avoid that the double-click on the CFileDialog sends the WM_LBUTTONUP message to the next window causing the Unselect of an item that is under the mouse cursor.
    // http://www.experts-exchange.com/Programming/System/Windows__Programming/Q_10287063.html#a2476475
    MSG msg;
    while(PeekMessage(&msg,0,WM_LBUTTONUP,WM_LBUTTONUP,PM_REMOVE));

    int DoModalRes = dlg.DoModal();

И вы можете поверить, что я положил большую улыбку на лицо моего босса:)