[Win32] Каким образом ListBox’ы узнают, что мышь кликнула за их пределами?01.09.18 18:29 Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 01.09.18 18:31 Количество правок: 2
Делаю альтернативу стандартному ListBox’у – в MS Access. Чтобы у каждого пункта ListBox’а могло быть несколько строк, и чтобы длина каждого пункта могла быть больше 256 символов. Сделал всплывающее модальное окно без границ, - выглядит как надо. Единственная проблема: не знаю как сделать, чтобы при мышином клике за пределами окна, оно закрывалось.
Коллеги, может быть знаете, каким образом это в стандартных ListBox’ах реализовано?
Была идея воспользоваться Access’овской альтернативой WM_KILLFOCUS («потеря фокуса»), но почему-то «формы» не реагируют на событие «потеря фокуса». На них реагируют только диалоговые элементы, размещённые на форме. Когда, например на форме размещаешь два editbox’а и следишь за срабатыванием событий получения и потери фокуса – они все срабатывают.
Плюс, если на форме есть хотя бы один диалоговый элемент, который может получить фокус (те же editbox’ы), то событие «получение фокуса» самой формы – тоже не срабатывает. Я так понимаю, это прикол Access’а такой (он похоже отфильтровывает часть сообщений WM_XXX). Может у кого-то есть идеи, как несмотря на это – всё же отследить, что фокус с окна ушёл?
для окон можно попробовать wm_activate02.09.18 18:21 Автор: dl <Dmitry Leonov>
Ну так это событие срабатывает, когда форма активируется, а мне – обратное надо. Я про диалоговые элементы и формы в предыдущем посте упомянул только для демонстрации того факта, что в MS Access событие WM_KILLFOCUS плохо работает.
оно срабатывает в обе стороны03.09.18 18:28 Автор: dl <Dmitry Leonov>
Возникла идея – фиксировать в лог все сообщения оконные, которые окну приходят. Сделал это, подключившись к Access’овскому окну через сабклассинг, но сообщения с номером 0x06 (WM_ACTIVATE) так и не дождался. WM_KILLFOCUS – тоже неудовлетворительно работает. Если с текущего окна кликаешься на другое, то сообщение это приходит, а если на панель задача кликаешь, то не приходит. О том, исключительно Access’ная это особенность, или вообще обще-Windows-ная – не разбирался (из других сред сабклассингом анализ не проводил), потому как всё равно не буду в обозримом будущем с Access’а на другую платформу переходить.
Теперь другая идея возникла… И вопрос по ней. Как моё модальное окно узнаёт, что клик случился за его пределами? А оно узнаёт об этом точно, потому как начинает недовольство проявлять (пиликает и мигает, мол тыкай на меня, а не мимо)? Вот если бы отловить приход этого уведомления, и прикрутить на него процедуру закрытия, – моя проблема решилась бы.
PS. Сабклассинг в MS Access работает криво (если IDE-активна, при сабкласинге чехарда начинается – видимо IDE его тоже активно использует).
Много лет назад, помню, гонял его под WinXP, а сейчас скачиваю, и он под WinXP не работает к сожалению (до сих пор под XP сижу, и слазить не планирую).11.10.18 06:01 Автор: Vedrus <Serokhvostov Anton> Статус: Member
в ms access событие wm_killfocus плохо работает03.09.18 04:49 Автор: Zef <Alloo Zef> Статус: Elderman Отредактировано 03.09.18 05:09 Количество правок: 1
Интересно. я на С писал нечто подобное - у меня подсвечивались статики, на которыые я наезжал курсором. Проблем не было.
Вообще, у меня такое впечатление, что это - какой-то глюк библиотек Вижуалстудии после "шестерки". Я часто замечаю зависание на экране "бесхозных" контекстных меню. Старые программы этим не грешат.
Ну так я же написал чуть выше об этом - в посте, который...03.09.18 05:53 Автор: Vedrus <Serokhvostov Anton> Статус: Member