Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отпрака кликов под форму. Как реализовать? А вдруг это прото. :) 
:(
    Опции темы
Messages
Дата 31.5.2006, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



Вобщем проблемка. Нарисовала я себе красивые часики... прозрачные... по верх всех окон. Но хочецца, чтобы они не мешали нажимать на компоненты под ними. Как это сделать, подскажите, плиз? Вдруг это просто и я все пойму. smile 
PM MAIL   Вверх
Guedda
Дата 31.5.2006, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Над рабочей программой висит полупрозрачная форма с часиками. И нужно, чтобы часики эти были "полностью прозрачными", т.е. даже клики мышкой проходили сквозь неё.
У меня по этому поводу есть только одно предложение:
Сделать следующий обработчик:
Цитата

- обработать нажатие (клик)
- узнать координаты курсора (GetCursorPos - функция)
- узнать, что в этих координатах висит.
  


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Messages
Дата 31.5.2006, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



Плохо, очень плохо. Ибо если в точке висит несколько форм, несчитая часиков. Мы никогда не узнаем какая выше. smile
Или я об этом ничего не знаю? 
PM MAIL   Вверх
skyboy
Дата 31.5.2006, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



Messages, по идее, как то можно работать с z-координатой окон...  
PM MAIL   Вверх
Mechanic
Дата 31.5.2006, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



А если перехватить HitTest мессаги, и рассказывать в них Винде, что юзверь в окно не попал?  smile  
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Sunvas
Дата 1.6.2006, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(skyboy @  31.5.2006,  22:00 Найти цитируемый пост)
Messages, по идее, как то можно работать с z-координатой окон...  

Z координаты в винде? Это что-то новое! 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Mechanic
Дата 1.6.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(Sunvas @  1.6.2006,  07:24 Найти цитируемый пост)
Z координаты в винде? Это что-то новое!

Та да.. ZOrder не так давно придумали.. Позже, чем окна.. Минут на 15..  smile  
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
skyboy
Дата 1.6.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



Sunvas, гляди:
Цитата("Windows SDK")

Z ORDER
The Z order of a window indicates the window's position in a stack of overlapping windows. This window stack is oriented along an imaginary axis, the z-axis, extending outward from the screen. The window at the top of the Z order overlaps all other windows. The window at the bottom of the Z order is overlapped by all other windows. 

Честно говоря, времени на поиск+тестирование не было... Вот, что я нашёл:
Цитата

The GetNextWindow function retrieves the handle of the next or previous window in the Z order. The next window is below the specified window; the previous window is above. 

Формат функции
Цитата

HWND GetNextWindow(
    HWND hWnd,    // handle of current window
    UINT wCmd  // direction flag
   );

Вот только, придётся работать с размерами: вдруг следующее по z-order окно наодится не под твои, а далеко от него, а под твоим находится 5-е или 7-е по счёту....
Вот эта функция может пригодиться:
Цитата

The GetWindowRect function retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. 
BOOL GetWindowRect(
    HWND hWnd,    // handle of window
    LPRECT lpRect  // address of structure for window coordinates
   );    

Сорри, что копи-пастю, а не направляю в справку, но тогда пришлось бы обьяснять, как добраться до Windows SDK  smile  
PM MAIL   Вверх
Yanis
Дата 1.6.2006, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



В винде нет Z-координат. Есть упорядоченность окон по Z-координате, но это не значит, что существуют и координаты Z. 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Mechanic
Дата 1.6.2006, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



А индекс в ZOrder'е - разве это не координата? Просто единица измерения по оси Z = одно окно vs пиксели по другим осям.  smile  
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Yanis
Дата 1.6.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Mechanic @  1.6.2006,  11:08 Найти цитируемый пост)
А индекс в ZOrder'е - разве это не координата?

<индекс в Z-последовательности> != <координата> IMHO, но тут уже дело в трактовке. Каждый пологает как ему удобно smile  


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
skyboy
Дата 1.6.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



Yanis, ладно-ладно, пускай будет "Z-порядок". Но тогда для людей, впервые столкнувшимся с подобными вопросами будет не совсем понятно(по крайней мере мне этот термин не кажется "интуитивно понятным"), в то время, как понятие "глубины" или "кординаты z" ближе  к привычному человеку трёхмерному миру и потому легче воспринимается.

Добавлено @ 11:00 
Понял, в чём загвоздка. Два объекта по определению могут иметь одинаковую координату, а одно и то же место в z-order списке два разных окна занимать не могут! Сорри, был не прав.  

Это сообщение отредактировал(а) skyboy - 1.6.2006, 11:02
PM MAIL   Вверх
Yanis
Дата 1.6.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Последовательность подразумевает, что окна идут друг за другом, перекрываются и т.д. smile
Я потому и сказал 
Цитата(Yanis @  1.6.2006,  11:13 Найти цитируемый пост)
Каждый пологает как ему удобно
 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
skyboy
Дата 1.6.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



Messages, если полностью расписать алгоритм, то:
при помощи GetNextWindow перебираешь все окна, находящиеся ЗА твоим, пока не окончится список окон, или пока не найдёшь окно за своим, в пределах которого находятся координаты клика(размеры текущего обрабатываемого окна получаешь при помощи функции GetWindowRect; принадлежность точки клика прямоугольному региону можно определить при помощи функции PtInRegion); если обнаруживаешь, что окно подходит под параметры, ищешь для этого окна дочерние контролы/окна при помощи EnumChildWindows и для каждого из них(если я не путаю, то в этом месте ты уже будешь перебирать контролы) проверяешь принадлежность точки клика их региону(см. выше), как только найдёшь, необходимо рекурсивно повторить всё начиная с вызова EnumChildWindows, потому что на форме может лежать GroupBox, на нем - панель, на ней - панель и только уже потом - кнопка. Потому надо будет перебирать рекурсивно - чтоб ты не посылала клик панели, а добралась до кнопки. А потом уже, как найдёшь нужный объект, отсылаешь ему сообщение о клике при помощи SendMessage(сначала - сообщение WM_LBUTTONDOWN, а потом - WM_LBUTTONUP).
Я вообще почти не работал с Windows API, потому прошу критически относится к моим словам smile 
PM MAIL   Вверх
Rrader
Дата 1.6.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Как вариант:
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  Color := clGreen;
  TransparentColor := True;
  TransparentColorValue := clGreen;
  AlphaBlend := True;
  AlphaBlendValue := 100;
  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
    SWP_NOSIZE Or SWP_NOMOVE);
end;
 


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Mechanic
Дата 2.6.2006, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(Rrader @  1.6.2006,  12:17 Найти цитируемый пост)
  AlphaBlendValue := 100;
  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
    SWP_NOSIZE Or SWP_NOMOVE);

 smile 
И чё, это воркает? 

/me У него просто нет AlphaBlendValue (D5).  smile 

Бо уже покурил даже про XP Ghost Window:
Цитата(MSDN said)

Windows XP: If a top-level window stops responding to messages for more than several seconds, the system considers the window to be not responding and replaces it with a ghost window that has the same z-order, location, size, and visual attributes. This allows the user to move it, resize it, or even close the application. However, these are the only actions available because the application is actually not responding. When in the debugger mode, the system does not generate a ghost window.


 smile 

Цитата(Yanis @  1.6.2006,  10:13 Найти цитируемый пост)
<индекс в Z-последовательности> != <координата>

Другой бы спорил.. А мне пофик..  smile  Ну, ордер, так ордер. Все равно по ордеру, как и по коорде, можно сказать какое окно выше / ниже / дальше / ближе, а споры о терминологии оставим лингвистам и юристам.  smile  
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Messages
Дата 9.6.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



Rrader, спасибо тебе за хорошую попытку. smile
 Для меня этот код не подходит. Ты просто делаешь дырку в форме вместо определенного цвета. А мне нужно, что бы не дырка. smile Что бы оно отображала стрелки, циферблат, напоминалки...  Это тоже вариант, но не мой.


To ALL, спасибо огромное за труды. Придется перебирать окна. smile Но если вдруг кто нить найдет способ по проще, Милости просим сообщить, предпологаеться много версий. smile

Возникает еще проблема. smile Что делать с меню? И если посылать клик окну в определенную координату, будет ли оно пересылать этот клик своей кнопке и т. д. в этой координате.

Ага, меню появляеться выше. Одной проблемой меньше. smileНо вот упростить процесс отправки не помешало бы. Буду эксперементировать. Если что сообщу. Но необещаю, что быстро: я счасс типа в больнице. smile 
PM MAIL   Вверх
Sunvas
Дата 12.6.2006, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Единственный выход, который я вижу, это использование оверлеев. 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Messages
Дата 12.6.2006, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



Sunvas, а раскажи, что это? Ну, и с чем его едят?   smile 
PM MAIL   Вверх
Sunvas
Дата 12.6.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89





--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
bems
Дата 16.6.2006, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Сам не пробовал но 
Цитата(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwui/html/layerwin.asp)

If the layered window has the WS_EX_TRANSPARENT extended window style, the shape of the layered window will be ignored and the mouse events will be passed to the other windows underneath the layered window.

 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Mailman
Дата 17.6.2006, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Если будет такая возможность, скинь плз вариант исходника данной функции - очень интересно. И полезно будет всем, думаю. 
PM MAIL   Вверх
bems
Дата 18.6.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



А функция старая - CreateWindowEx. 
Код

CreateWindowEx(WS_EX_TRANSPARENT or WS_LAYERED...
 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Messages
Дата 24.6.2006, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



bems, спасибо. Но что-то я не могу понять где чего перегрузить, что бы этим свойством обладал мой класс:TForm. 
PM MAIL   Вверх
bems
Дата 24.6.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



например в OnCreate формы

SetWindowLong(handle,GWL_EXSTYLE,GetWindowLong(handle,GWL_EXSTYLE) or WS_EX_TRANSPARENT or WS_EX_LAYERED)

Добавлено @ 10:23 
Но только если у тебя AlphaBlend=true. Или ты используешь апишки для применения прозрачности. Иначе эффект будет несколько другой smile 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Messages
Дата 27.6.2006, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



bems, все равно как добиваться прозрачности. Главное чтобы клики тоже прозрачные. smile Спс. 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1124 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.