Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431

Кнопки перестают реагировать на мышь при прозрачной форме

30.12.2023, 17:28. Показов 1980. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Я у себя в самописной демке, где разные шарики гоняются друг за другом, решил сделать режим "прозрачности", чтобы шарики бегали прямо по рабочему столу.
Стал изучать вопрос в инете, нашел простенький пример, попробовал, все заработало.
Суть примера в использовании SetLayeredWindowAttributes().
В конструкторе:
C++
1
2
3
4
5
SetBackgroundStyle(wxBG_STYLE_CUSTOM);
long old_flags = GetWindowLong(GetHandle(), GWL_EXSTYLE);
SetWindowLong(GetHandle(), GWL_EXSTYLE, old_flags | WS_EX_LAYERED);
SetLayeredWindowAttributes(GetHandle(), RGB(254, 0, 254), 255, LWA_ALPHA);
SetLayeredWindowAttributes(GetHandle(), RGB(254, 0, 254), 255, LWA_COLORKEY);
В OnPaint:
C++
1
2
3
4
wxSize size = this->GetVirtualSize();
dc.SetPen(wxPen(wxColor(254, 254, 254)));
dc.SetBrush(wxBrush(wxColor(254, 0, 254)));
dc.DrawRectangle(0, 0, size.x, size.y);
(использовалсь библитека wxWidgets)

В рабочем окне, где бегают шарики, я разместил небольшую узкую панель с кнопками, которая "прижата" к нижнему краю окна. У панели парент - окно, у кнопок, соответственно, панель. Вглядит это все примерно так:



Но возникла следующая проблема:

Проблема состоит в том, что в этом режиме (когда фон прозрачный), кнопки внизу не реагируют на мышь. Причем не "ловят" именно клик, а вот событие "mouseover" ловят (кнопка реагирует изменением подсветки).

Эксперимент показал следующее:

1. Высота панели - 22 пикселя. Если "уменьшить" прямоугольник по Y на 40 пикселей (т.е., над панелью остается "полоса" на 18 пикселей), то кнопки начинают реагировать на клик мышки.
Если уменьшать на меньшее значение, то область клика на кнопках "опускается". Т.е., в верхней части кнопки не реагирует на клик, а в нижней - реагируют.

2. Если "сузить" прозрачный прямоугольник, то перестают реагировать на клик только те кнопки, который под ним. Те, что остались слева/справа - реагируют.

3. При изменении цвета прямоугольника (на любой "непрозрачный") все работает.

Я попытался разобраться, что на самом деле делает функция SetLayeredWindowAttributes(), но в инете, в основном, только ее описание и примеры, как с ее помощью делать прозрачные окна.

Насколько я понимаю, при рисовании прямоугольника через dc никаких объектов/контролов создаваться не должно. Как цвет может влиять на данную ситуацию?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.12.2023, 17:28
Ответы с готовыми решениями:

Через некоторое время работы в недавно обновленной до 10-ки винде, перестают реагировать USB клава и мышь
Доброго времени суток. У меня такая же проблема, через некоторое время работы в недавно обновленной до 10-ки винде, перестают реагировать...

Иногда гаснет экран, кнопки перестают реагировать даже на системном блоке
Случается это крайне редко, примерно раз в два месяца, при ежедневном использовании ПК не менее 8 часов. Так же, это...

Мышь то перестает реагировать, то бегает сама по экрану, прокручивает страницу, кнопки сами нажимаются :(((
Мышь иногда перестает реагировать - я ей двигаю, а курсор стоит на месте. Также в это время, когда именно мышка не реагирует, кливиатура не...

3
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,119
31.12.2023, 14:50
Constcat, не очень понятна ваша проблема, но могу кое-что предположить. Возможно дело в том, что для прозрачных окон особым образом определяется факт нахождения курсора мыши над окном. Вообще, мышь является общим ресурсом. В обычном состоянии сообщения мыши направляются тому окну над которым находится курсор мыши. И не важно какое окно сейчас является активным. Без этого нельзя было бы мышью переключаться между окнами. По умолчанию для прозрачного окна учитывается прозрачность пикселя над которым находится курсор мыши. И если курсор находится над прозрачным пикселем, то сообщения мыши направляются не прозрачному окну, а окну под ним. Такое поведение не совсем очевидно для людей начинающих экспериментировать с подобными окнами и по началу может ставить в тупик. Возможно вам удастся переопределить стандартное поведение мыши сделав свой обработчик сообщения WM_NCHITTEST.
1
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,141
31.12.2023, 15:46
Constcat, в Qt я заливал окно почти прозрачным фоном, например "#01000001" (ARGB). Тут, наверное, можно так же поступить
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
31.12.2023, 19:30  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
И если курсор находится над прозрачным пикселем, то сообщения мыши направляются не прозрачному окну, а окну под ним.
Очень похоже на правду. Потому что сквозь это прозрачное окно все элементы, которые под ним, "ловят" фокус мыши.

Я это, скажем так, принял, как особенность реализации)))

Но панель у меня "непрозрачная", и кнопки непрозрачные.
И судя по эксперименту, область клика находится где-то ниже кнопок, потому что когда я "поднимаю" прозрачный прямоугольник, то "поднимается" и область клика в кнопках. Можно подобрать такие значения, при которых нижняя половина кнопок будет реагировать на клик, а верхняя - нет.

Добавлено через 1 час 32 минуты
Да, когда щелкаешь по кнопкам, то основное окно как бы "теряет фокус", т.е., создается впечатление, что клик передается куда-то за окно. Хотя под кнопками, как я понимаю, лежит непрозрачная панель.

Добавлено через 57 секунд
Цитата Сообщение от Ygg Посмотреть сообщение
Возможно вам удастся переопределить стандартное поведение мыши сделав свой обработчик сообщения WM_NCHITTEST.
Ну, если по другому не получится, то придется таким способом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.12.2023, 19:30
Помогаю со студенческими работами здесь

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

Мышь перестает реагировать
Мышь razer deathAdder(~5лет) перестает реагировать на несколько минут, после чего опять работает. Звуков что устройство отпало нет и...

Перестают работать кнопки навигации при переводе с языка на язык
У меня есть бургер меню, на английском языке переходы от блока к блоку работают, но при переводе на русский язык кнопки перестают нормально...

При добавлении прозрачной кнопки на webbrowser цвет фона всё равно непрозрачный
Доброго времени суток. Не могу разобраться почему при добавлении прозрачной кнопки на webbrowser всё равно цвет фона не прозрачный. Хотя,...

При добавлении компонента DataGridView перестают работать всплывающие подсказки на форме
Всем привет! Тоже столкнулся с одной проблемой, связанной с компонентом dataGridView - при добавлении его на форму и построении проекта в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru