Закрытие модальной формы при щелчке мышью за пределами области формы

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


person Guamez    schedule 04.10.2010    source источник
comment
Фокус здесь ни при чем, Майкл. Я думаю, вы добавили последнюю строку. :)   -  person Nayan    schedule 04.10.2010


Ответы (3)


Вам нужно подключить мышь (и клавиатуру, если требуется) и зафиксировать их события. Затем проверьте, произошел ли щелчок за пределами формы (и области). Если да, отметьте табличку, которая может быть прочитана моделью формы, чтобы ее можно было закрыть.

Алгоритм:

  1. Событие щелчка мыши.

  2. Когда вызывается функция обратного вызова, проверьте позицию щелчка — находится ли она внутри вашей формы или нет (вам может потребоваться перевести местоположения в местоположения на рабочем столе — надеюсь, вы знаете, как это сделать!)

  3. Если точка находится за пределами формы, установите флаг (логический или любой другой, который вас порадует). Убедитесь, что форма может как-то прочитать флаг.

  4. Инициировать событие для захвата формы. В его обработчике считывается статус флага. Если true, закрыть/выгрузить форму.

На этой странице вы найдете технические подробности и функции.

person Nayan    schedule 04.10.2010
comment
Это много работы для того, что может быть простым ответом. Если ОП абсолютно необходимо, чтобы это была модальная форма (и я не могу понять, почему он это сделает), то то, что вы говорите, сработает (это все еще требует больших усилий). Однако я предпочитаю простые решения, когда это возможно - person James King; 04.10.2010

Я не думаю, что вам нужно делать его модальным... тогда вы можете воспользоваться возможностью siride закрыть его в событии Deactivate.

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

person James King    schedule 04.10.2010
comment
Что делать, если программист не может изменить модальный характер? Предположим, это по замыслу? Тем не менее, если требуется, есть и другие способы. Я не буду голосовать против вас, хотя я чувствую, что вы не поняли возможности. - person Nayan; 04.10.2010
comment
Кроме того, по словам Гуамеса, пользователь может нажать «Рабочий стол». Даже тогда код должен работать. Вы всегда можете щелкнуть рабочий стол, даже если ваши формы являются модальными... за исключением некоторых особых случаев. - person Nayan; 04.10.2010
comment
Исходя из предположения, что если он достаточно хорошо разбирается в коде, чтобы реагировать на клики пользователя, он, вероятно, может решить, как будет отображаться сама форма. Какие еще идеи вы думаете? - person James King; 04.10.2010
comment
Правильно, пользователь МОЖЕТ щелкнуть рабочий стол... что все равно вызовет событие LostFocus, поэтому оно все равно должно работать. Это также будет работать, если пользователь щелкнет в другом окне или в главном окне того же приложения... как я понимаю, что ищет OP. - person James King; 04.10.2010
comment
Вы действительно пробовали мероприятие LostFocus, Джеймс? Я так не думаю. :) Это не работает так, как вы ожидаете... если вы не докажете, что я ошибаюсь с каким-нибудь рабочим кодом! - person Nayan; 04.10.2010
comment
(1) на самом деле это событие деактивации, потому что это форма, и (2) это то, как это работает для немодальной формы, что и является моей точкой зрения... не используйте модальную форму, и она будет вести себя как ОП хочет - person James King; 04.10.2010
comment
Но это не работает для модальных форм. Ибо модально - это то, о чем упомянул OP. - person Nayan; 04.10.2010

Вот точное решение вашего вопроса:

http://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C#

person Asad Naeem    schedule 26.02.2013