Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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