Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.09.27;
Скачать: [xml.tar.bz2];

Вниз

Как поймать клик на перекрытом дочерними родительском контроле?   Найти похожие ветки 

 
Kolan ©   (2009-07-22 16:42) [0]

Здравствуйте!

На контроле лежат другие контролы (и родитель и все остальные — наследники TCustomControl). Как поймать клик на родителе если сам клик приходится на дочерний контрол. То есть кликнули как бы на родительский контрол, но между мышкой и родительским контролом затесался еще дочерний.

Так как все эти классы мои, то я, конечно, могу подписать родителя на события дочерних контролов или применить похожий механизм, но может быть можно иначе, ведь в момент клика мышка находится и над родительским контролом тоже.


 
Игорь Шевченко ©   (2009-07-22 16:45) [1]


> Как поймать клик на родителе если сам клик приходится на
> дочерний контрол. То есть кликнули как бы на родительский
> контрол, но между мышкой и родительским контролом затесался
> еще дочерний.


Сам понял, что сказал ?


 
StriderMan   (2009-07-22 16:52) [2]

1. ловить в дочерних мессагу CM_HITTEST.
при возврате в Message.Result := 0; мессага уйдет "вниз".
правда для TWinControl"ов работать не будет.

2. Обрабатывать массаги в Application.OnMessage и направлять "куда следует"


 
Kolan ©   (2009-07-22 16:58) [3]

Если не понятно, то вот иллюстрация: http://img-fotki.yandex.ru/get/3611/ksoftware.b/0_2c4c4_9f75d842_orig

Если просто положить контролы один на другой, то нижний (родитель) не получит клика, а мне нужно, чтобы он дошел до самого низу.


 
Игорь Шевченко ©   (2009-07-22 17:09) [4]


> Если просто положить контролы один на другой, то нижний
> (родитель) не получит клика, а мне нужно, чтобы он дошел
> до самого низу.


Глупый вопрос - зачем ? Впрочем, тебе никто не запрещает пересылать клик родителю самостоятельно.


 
clickmaker ©   (2009-07-22 17:23) [5]

The WM_MOUSEACTIVATE message is sent when the cursor is in an inactive window and the user presses a mouse button. The parent window receives this message only if the child window passes it to the DefWindowProc function

не оно?


 
Игорь Шевченко ©   (2009-07-22 17:40) [6]


> не оно?


не оно


 
StriderMan   (2009-07-22 17:56) [7]


> StriderMan   (22.07.09 16:52) [2]
> 1. ловить в дочерних мессагу CM_HITTEST.

ЗЫ: можно и проще, перекрыть метод:
function TControl.HitTest(X, Y: Integer): Boolean; dynamic;


 
Юрий Зотов ©   (2009-07-22 19:41) [8]

Это у всех контролов ловить или перекрывать - сколько ж писать придется? А завтра контрол еще одного класса на форме появится - опять писать.

Проще мышиный хук повесить. Один раз.


 
Игорь Шевченко ©   (2009-07-22 19:44) [9]


> Проще мышиный хук повесить. Один раз.


проще не хотеть странного


 
жж   (2009-07-22 20:01) [10]


> Это у всех контролов ловить или перекрывать - сколько ж
> писать придется?


Можно обойтись без этого - подменой оконных процедур в цикле всем контролам формы.


 
Юрий Зотов ©   (2009-07-22 20:15) [11]

> Игорь Шевченко ©   (22.07.09 19:44) [9]

> проще не хотеть странного

Степень странности обычно зависит от степени знания задачи. Часто при ближайшем рассмотрении оказывается, что не все так уж и странно...
:о)


 
Игорь Шевченко ©   (2009-07-22 20:41) [12]

Юрий Зотов ©   (22.07.09 20:15) [11]

Не встречал задач, в которых требуется описываемое поведение. Даже трудно представить, зачем такое потребовалось :)


 
Kolan ©   (2009-07-22 23:09) [13]

Зачем это нужно.
Если уважаемые комментаторы помнят, я как то спрашивал про создание компонента похожего на выдачу Яндекс.Картинок (а для тех кто не помнит ту ветку — я делаю компонет похожий на выдачу Яндекс.Картинок).

Компонент устроен так: есть контейнер в котором находятся другие компоненты (картинки). Для прокрутки полосы картинок используется мышка, но если родитель не в фокусе, то он не получает уведомления о прокрутки ролика мыши. Вот я и решил ловить клики по компоненту и по картинкам (дочерним компонентам) и ставить фокус.


 
Игорь Шевченко ©   (2009-07-23 00:43) [14]

картинка имеет свой handle окна ? если нет, то при клике фокус устанавливается на родительское окно


 
Германн ©   (2009-07-23 01:01) [15]


> Kolan ©   (22.07.09 23:09) [13]
>
> Зачем это нужно.
> Если уважаемые комментаторы помнят, я как то спрашивал про
> создание компонента


> Kolan ©   (22.07.09 16:42)
>
> Здравствуйте!
>
> На контроле лежат другие контролы (и родитель и все остальные
> — наследники TCustomControl). Как поймать клик на родителе
> если сам клик приходится на дочерний контрол. То есть кликнули
> как бы на родительский контрол, но между мышкой и родительским
> контролом затесался еще дочерний.
>
> Так как все эти классы мои, то я, конечно, могу подписать
> родителя на события дочерних контролов или применить похожий
> механизм, но может быть можно иначе, ведь в момент клика
> мышка находится и над родительским контролом тоже.
>

???
Создаёшь компонент? Ну так и создавай.
Пока что создаётся мнение, что ты создаёшь что-то, чему место только в Репозитории.


 
StriderMan   (2009-07-23 10:24) [16]


> Это у всех контролов ловить или перекрывать - сколько ж
> писать придется? А завтра контрол еще одного класса на форме
> появится - опять писать.

разумеется это все актуально если есть возможность сделать один общий базовый класс.

А вообще конечно да, перехватить мышь. вариантов много: WndProc, Application.OnMessage, хуки в конце концов....


 
Kolan ©   (2009-07-23 16:12) [17]

Игорь, картинки — наследники TCustomControl, и, как я понимаю, хендл у них есть.


 
Игорь Шевченко ©   (2009-07-23 16:42) [18]

Kolan ©   (23.07.09 16:12) [17]

Ну и передавай в картинке клик родителю - в чем проблема ?


 
clickmaker ©   (2009-07-23 16:42) [19]

> [17] Kolan ©   (23.07.09 16:12)

если TImage, то нет


 
Kolan ©   (2009-07-23 16:49) [20]

clickmaker, у меня TMyImage = class(TCustomControl).

Проблемы, Игорь, нет, я думал, что есть стандартный способ, который позволит решить задачу изящнее, возможно даже без дополнительного кода.


 
oldman ©   (2009-07-23 17:46) [21]


> Kolan ©   (22.07.09 16:42)  


Поддерживаю [12]

"У меня активно окно2. А под ним находится окно1. Как мне набрать текст в окне1?"

Маразм!!!
Хочешь легкой жизни - не перекрывай контролы для клика!


 
StriderMan   (2009-07-24 12:50) [22]


> я думал, что есть стандартный способ, который позволит решить задачу изящнее

это пробовали?? StriderMan   (22.07.09 17:56) [7]



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.09.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.005 c
2-1248173443
Pavel
2009-07-21 14:50
2009.09.27
Перемещение Image в ScrollBox


3-1227448685
otan
2008-11-23 16:58
2009.09.27
Заливка в excell данных из adotable


15-1248533265
Kolan
2009-07-25 18:47
2009.09.27
«Интерфейс пользователя» → TEdit вместо TLabel


2-1248344622
kostyl_kostyl
2009-07-23 14:23
2009.09.27
Как абстрагироваться от типов свойств класса?


15-1248807077
FF_FF
2009-07-28 22:51
2009.09.27
Парсер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский