Форум: "Начинающим";
Текущий архив: 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