Mouse Click мимо модальной формы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Mouse Click мимо модальной формы

Сообщение Mikle » 22.03.2023 (Ср) 19:07

Подскажите, как узнать, что пользователь кликнул мышью мимо модальной формы?
События Form_Deactivate и Form_LostFocus не происходят, ведь форма модальная.
Лучше всего было бы узнать, что клик был в другую форму проекта, а не на постороннее окно или вообще мимо, во втором случае снимается фокус со всего проекта, никакой особой реакции, связанной с модальностью, не ожидается.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Mouse Click мимо модальной формы

Сообщение Хакер » 23.03.2023 (Чт) 1:33

Так-то ответ довольно прост: путём отлова оконных сообщений.

Что более интересно: если мы рассмотрим возможность получать уведомление о подобном клике как сервис или услугу, то кто является услугополучателем? Проект как глобальная сущность? Или модальное окно формы, мимо которого кликнули? Или окно, накрытое модальным окном, мимо которого кликнули? А если есть много немодальных окон, накрытых каскадом из модальных окон, то кто именно должен получить пинок о факте клика по самому «заднеплановому» по Z-order-у окну?

Ну и дополнительно. Вот такой код:
Код: Выделить всё
    f.Show vbModeless, Me
    Me.Enabled = False

даёт эффект, неотличимый от f.Show vbModal, Me. Должен ли механихм ослеживания кликов за пределы модального окна реагировать при кликах вне дочернего окна, показанного таким способом, или же наоборот — принципиально не должен?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Mouse Click мимо модальной формы

Сообщение The trick » 23.03.2023 (Чт) 7:16

Как я уже писал тебе поможет SetCapture + WS_EX_TOOLWINDOW. Делать раскрывающийся список на модальных окнах - так себе решение.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Mouse Click мимо модальной формы

Сообщение Mikle » 23.03.2023 (Чт) 9:33

Хакер писал(а):даёт эффект, неотличимый от

Ещё как отличимый:
1. Главное окно видно в таскбаре, модальное не видно. Я вызываю модальное окно, потом перекрываю оба окна сторонним окном (проводником). Далее активирую главное окно кликом на его отображение в таскбаре - модальное окно появится тоже, а показанное по твоему рецепту нет.
2. Код в процедуре, расположенный после вызова Show vbModal не выполняется до закрытия модального окна.

The trick писал(а):поможет SetCapture + WS_EX_TOOLWINDOW. Делать раскрывающийся список на модальных окнах - так себе решение

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

Просто я хотел написать выпадающий список, не требующий никаких инициализаций и уничтожений, вызываемый одной единственной функцией с возвращаемым значением (а тут нужно ожидание закрытия окна). С модальным окном это получалось:
Вложения
Modal.zip
(3.19 Кб) Скачиваний: 13

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Mouse Click мимо модальной формы

Сообщение Хакер » 23.03.2023 (Чт) 14:45

Судя по аттачу, это попытка переизобрести всплывающее меню, которое можно показать методом PopupMenu. Зачем его переизобретать?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Mouse Click мимо модальной формы

Сообщение Хакер » 23.03.2023 (Чт) 14:50

The trick писал(а):Как я уже писал тебе поможет SetCapture + WS_EX_TOOLWINDOW.

SetCapture не нужен: ни менюшки, ни дропдаун-списки (как у комбобокса) захват не используют.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Mouse Click мимо модальной формы

Сообщение The trick » 23.03.2023 (Чт) 19:44

Хакер писал(а):
The trick писал(а):Как я уже писал тебе поможет SetCapture + WS_EX_TOOLWINDOW.

SetCapture не нужен: ни менюшки, ни дропдаун-списки (как у комбобокса) захват не используют.

На win7 используют комбобоксы. Чуть позже скину название функции. Сообщение LBCB_STARTTRACK. На XP тоже самое.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Mouse Click мимо модальной формы

Сообщение Mikle » 24.03.2023 (Пт) 9:19

Хакер писал(а):это попытка переизобрести всплывающее меню, которое можно показать методом PopupMenu. Зачем его переизобретать?

Сейчас подумал - можно же сделать в меню всего один пункт с индексом 0, тогда можно не только на ходу добавлять\убавлять пункты, но и обойтись одним общим обработчиком mnu_Click() для всего меню. Наверное, так и сделаю.
Просто мне понравилась сама идея - единственная форма, не требующая никаких инициализаций\деинициализаций, без зависимостей и Public сущностей (кроме нужной функции), формирование и вызов меню с возвратом значения - одной строкой.
Попробовал сделать на форме без модальности - получилось, только уже с кодом и в форме, и в модуле и с торчащими наружу Public переменными. Зато без проблем обрабатывает потерю фокуса.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Mouse Click мимо модальной формы

Сообщение The trick » 24.03.2023 (Пт) 16:24

Так есть же TrackPopupMenuEx - показывает меню и возвращает индекс выбранного элемента. Просто меню и выпадающий список - немного разные вещи. У выпадающего списка есть удобный скроллбар.
UA6527P

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Mouse Click мимо модальной формы

Сообщение Teranas » 25.03.2023 (Сб) 13:01

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


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList