| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Отпрака кликов под форму. |
| Автор: Messages 31.5.2006, 01:02 |
| Вобщем проблемка. Нарисовала я себе красивые часики... прозрачные... по верх всех окон. Но хочецца, чтобы они не мешали нажимать на компоненты под ними. Как это сделать, подскажите, плиз? Вдруг это просто и я все пойму. |
| Автор: Guedda 31.5.2006, 10:04 | ||
| Над рабочей программой висит полупрозрачная форма с часиками. И нужно, чтобы часики эти были "полностью прозрачными", т.е. даже клики мышкой проходили сквозь неё. У меня по этому поводу есть только одно предложение: Сделать следующий обработчик:
|
| Автор: Messages 31.5.2006, 20:26 |
| Плохо, очень плохо. Ибо если в точке висит несколько форм, несчитая часиков. Мы никогда не узнаем какая выше. Или я об этом ничего не знаю? |
| Автор: skyboy 31.5.2006, 22:00 |
| Messages, по идее, как то можно работать с z-координатой окон... |
| Автор: Mechanic 31.5.2006, 23:21 |
| А если перехватить HitTest мессаги, и рассказывать в них Винде, что юзверь в окно не попал? |
| Автор: Sunvas 1.6.2006, 07:24 |
Z координаты в винде? Это что-то новое! |
| Автор: Mechanic 1.6.2006, 09:33 |
Та да.. ZOrder не так давно придумали.. Позже, чем окна.. Минут на 15.. |
| Автор: skyboy 1.6.2006, 09:50 | ||||||||
Sunvas, гляди:
Честно говоря, времени на поиск+тестирование не было... Вот, что я нашёл:
Формат функции
Вот только, придётся работать с размерами: вдруг следующее по z-order окно наодится не под твои, а далеко от него, а под твоим находится 5-е или 7-е по счёту.... Вот эта функция может пригодиться:
Сорри, что копи-пастю, а не направляю в справку, но тогда пришлось бы обьяснять, как добраться до Windows SDK |
| Автор: Yanis 1.6.2006, 09:57 |
| В винде нет Z-координат. Есть упорядоченность окон по Z-координате, но это не значит, что существуют и координаты Z. |
| Автор: Mechanic 1.6.2006, 10:08 |
| А индекс в ZOrder'е - разве это не координата? Просто единица измерения по оси Z = одно окно vs пиксели по другим осям. |
| Автор: Yanis 1.6.2006, 10:13 |
<индекс в Z-последовательности> != <координата> IMHO, но тут уже дело в трактовке. Каждый пологает как ему удобно |
| Автор: skyboy 1.6.2006, 10:54 |
| Yanis, ладно-ладно, пускай будет "Z-порядок". Но тогда для людей, впервые столкнувшимся с подобными вопросами будет не совсем понятно(по крайней мере мне этот термин не кажется "интуитивно понятным"), в то время, как понятие "глубины" или "кординаты z" ближе к привычному человеку трёхмерному миру и потому легче воспринимается. Добавлено @ 11:00 Понял, в чём загвоздка. Два объекта по определению могут иметь одинаковую координату, а одно и то же место в z-order списке два разных окна занимать не могут! Сорри, был не прав. |
| Автор: Yanis 1.6.2006, 11:02 |
| Последовательность подразумевает, что окна идут друг за другом, перекрываются и т.д. Я потому и сказал |
| Автор: skyboy 1.6.2006, 11:42 |
| Messages, если полностью расписать алгоритм, то: при помощи GetNextWindow перебираешь все окна, находящиеся ЗА твоим, пока не окончится список окон, или пока не найдёшь окно за своим, в пределах которого находятся координаты клика(размеры текущего обрабатываемого окна получаешь при помощи функции GetWindowRect; принадлежность точки клика прямоугольному региону можно определить при помощи функции PtInRegion); если обнаруживаешь, что окно подходит под параметры, ищешь для этого окна дочерние контролы/окна при помощи EnumChildWindows и для каждого из них(если я не путаю, то в этом месте ты уже будешь перебирать контролы) проверяешь принадлежность точки клика их региону(см. выше), как только найдёшь, необходимо рекурсивно повторить всё начиная с вызова EnumChildWindows, потому что на форме может лежать GroupBox, на нем - панель, на ней - панель и только уже потом - кнопка. Потому надо будет перебирать рекурсивно - чтоб ты не посылала клик панели, а добралась до кнопки. А потом уже, как найдёшь нужный объект, отсылаешь ему сообщение о клике при помощи SendMessage(сначала - сообщение WM_LBUTTONDOWN, а потом - WM_LBUTTONUP). Я вообще почти не работал с Windows API, потому прошу критически относится к моим словам |
| Автор: Rrader 1.6.2006, 12:17 | ||
Как вариант:
|
| Автор: Messages 9.6.2006, 12:05 |
| Rrader, спасибо тебе за хорошую попытку. Для меня этот код не подходит. Ты просто делаешь дырку в форме вместо определенного цвета. А мне нужно, что бы не дырка. To ALL, спасибо огромное за труды. Придется перебирать окна. Возникает еще проблема. Ага, меню появляеться выше. Одной проблемой меньше. |
| Автор: Sunvas 12.6.2006, 00:54 |
| Единственный выход, который я вижу, это использование оверлеев. |
| Автор: Messages 12.6.2006, 06:18 |
| Sunvas, а раскажи, что это? Ну, и с чем его едят? |
| Автор: Sunvas 12.6.2006, 11:08 |
| Вот тут http://www.delphimaster.ru/articles/directx/ |
| Автор: bems 16.6.2006, 23:38 | ||
Сам не пробовал но
|
| Автор: Mailman 17.6.2006, 19:44 |
| Если будет такая возможность, скинь плз вариант исходника данной функции - очень интересно. И полезно будет всем, думаю. |
| Автор: bems 18.6.2006, 09:13 | ||
А функция старая - CreateWindowEx.
|
| Автор: Messages 24.6.2006, 08:35 |
| bems, спасибо. Но что-то я не могу понять где чего перегрузить, что бы этим свойством обладал мой класс:TForm. |
| Автор: bems 24.6.2006, 10:18 |
| например в OnCreate формы SetWindowLong(handle,GWL_EXSTYLE,GetWindowLong(handle,GWL_EXSTYLE) or WS_EX_TRANSPARENT or WS_EX_LAYERED) Добавлено @ 10:23 Но только если у тебя AlphaBlend=true. Или ты используешь апишки для применения прозрачности. Иначе эффект будет несколько другой |
| Автор: Messages 27.6.2006, 00:58 |
| bems, все равно как добиваться прозрачности. Главное чтобы клики тоже прозрачные. |