Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
ВнизОбъекты на форме VS мышь. Найти похожие ветки
← →
Mr. Chel (2004-01-09 12:55) [0]Можно ли определить над каким объектом находится сейчас указатель мыши(Tedit, Tlabel, etc).?
← →
Тимохов (2004-01-09 12:57) [1]Можно.
← →
Тимохов (2004-01-09 12:58) [2]Для TLabel, правда не уверен, но для TEdit точно можно.
См в controls.pas по сроке поиска "find"
← →
[lamer]Barmaglot (2004-01-09 13:10) [3]Можно узнать над любым объектом. Иначе как бы виндовс знал куда ты мышь ведешь :-). Просто узнаешь координаты мыши и сверяешь с местоположением всех элементов на твоей форме. Если совпадает, то значит над этим компонентом и находится мышь...
← →
Ega23 (2004-01-09 13:10) [4]
Function MouseInControl(WC:TWincontrol):boolean;
var x1,x2,y1,y2:INTEGER;
ptm:tpoint;
begin
ptm:=Mouse.CursorPos;
x1:=Wc.ClientOrigin.x; //top-left
y1:=Wc.ClientOrigin.y;
x2:=x1+Wc.ClientWidth;
y2:=y1+Wc.ClientHeight;
result:=(ptm.x>=x1) and (ptm.x<=x2) and (ptm.y>=y1)and(ptm.y<=y2);
end;
Вместо TLabel я использовал TStaticText.
← →
Тимохов (2004-01-09 13:16) [5]lamer]Barmaglot © (09.01.04 13:10) [3]
TLabel не объект для windows.
Вот TEdit объект, TLabel нет, это порождение дельфи. Да у него и handle нет.
Если надо гарантировано найти, то только перебором.
← →
MBo (2004-01-09 13:16) [6]ControlAtPos
← →
NAlexey (2004-01-09 13:17) [7]>Ega23 ©
Т.е получается надо перебрать все контролы на форме передавая их в ф-цию? А если например панель владеет кнопкой, перебирая все контролы ты первой передашь панель, а мышь будет в это время над кнопкой?
← →
Тимохов (2004-01-09 13:21) [8]MBo © (09.01.04 13:16) [6]
Как всегда вы правы.
← →
[lamer]Barmaglot (2004-01-09 13:23) [9]А ты переберай компоненты с умом... Зачем тебе панель? Ну если очень надо, то можно задуматься на тему а как это виндовс знает какую вешь ему выводить до, а какую после??? Даю намек Z-position.
Тимохов © (09.01.04 13:16) [5]
TLabel не объект для windows.
Вот TEdit объект, TLabel нет, это порождение дельфи. Да у него и handle нет.
Спешу Вас огорчить - Дельфи ничего не выдумал нового. TLabel - это всего лишь Static у виндовса. Который имеет Handle (иначе как к нему обращаться?).
← →
Тимохов (2004-01-09 13:27) [10][lamer]Barmaglot © (09.01.04 13:23) [9]
Вы уверены?
Как тогда прокоментировать описание TGraphicControl - предка TLabel.
TGraphicControl supports simple lightweight controls that do not need the ability to accept keyboard input or contain other controls. Since lightweight controls do not wrap Windows screen objects, they are faster and user fewer resources than controls based on TWinControl.
← →
Игорь Шевченко (2004-01-09 13:27) [11]
> TLabel - это всего лишь Static у виндовса. Который имеет
> Handle
Бред
← →
Тимохов (2004-01-09 13:28) [12]Игорь Шевченко © (09.01.04 13:27) [11]
Во-во...
Что вообще спорить MBo полностью ответил на вопрос. Респект.
← →
MBo (2004-01-09 13:30) [13]>TLabel - это всего лишь Static у виндовса. Который имеет Handle
Ты неправ. Почитай о том, что такое TGraphicControl
← →
MBo (2004-01-09 13:37) [14]>Тимохов © (09.01.04 13:28) [12]
Стоит только учесть, что функция выдает только контролы, непосредственным Parent-ом которых будет Form, так что для WinControl-ов-контейнеров (TPanel, например) можно рекурсивно провести проверку дальше
← →
NAlexey (2004-01-09 13:37) [15]>Тимохов ©
>Что вообще спорить MBo полностью ответил на вопрос.
ControlAtPos это хорошо, только опять же, необходимо знать Parent у контрола который ищешь. Не подскажите ли как это сделать?
← →
Тимохов (2004-01-09 13:38) [16]MBo © (09.01.04 13:37) [14]
Да это я уже посмотрел.
Рукурсивную проверку.
Хотя не очень понятно, что атору нужно.
Если все-таки окакжется что не надо искать TLabel, то можно воспользоваться FindVCLWindow. Вроде как она тоже должна искать, но только WinControl"ы.
← →
Тимохов (2004-01-09 13:39) [17]NAlexey © (09.01.04 13:37) [15]
Имхо точно можно сделать рукурсивным перебором всех контролов начиная с формы.
← →
Ega23 (2004-01-09 13:41) [18]
>
> NAlexey © (09.01.04 13:17) [7]
> >Ega23 ©
> Т.е получается надо перебрать все контролы на форме передавая
> их в ф-цию? А если например панель владеет кнопкой, перебирая
> все контролы ты первой передашь панель, а мышь будет в это
> время над кнопкой?
Это писалось для того, чтобы сделать что-то гипа гиперссылки. Т.е. OnIdle перебирались несколько контролов, и если курсор там, то менялся вид курсора и цвет текста синим становился.
← →
klyonov (2004-01-09 13:50) [19]у TLabel есть Handle: HWND как и у любого TControl
← →
klyonov (2004-01-09 13:52) [20]то есть я имею в виду, у любого окна есть его HWND
← →
Тимохов (2004-01-09 13:52) [21]klyonov (09.01.04 13:50) [19]
Да? А где он там? В упор не вижу в TControl HWND... :(((
← →
Тимохов (2004-01-09 13:53) [22]Да HWND есть у любого окна но TLable вроде как не окно...
← →
Игорь Шевченко (2004-01-09 13:54) [23]klyonov (09.01.04 13:50)
> у TLabel есть Handle: HWND
И где же этот Handle ?
← →
Mr. Chel (2004-01-09 14:05) [24]Я вот нашел такую функцию FindDragTarget, находит все что надо, и не только если на форме лежит, но на Panel, которая лежит на PageControl.
З.Ы. Label тоже находит. ;)
Всем спасибо, господа.
← →
klyonov (2004-01-09 14:09) [25]может я чегото не понимаю...
но сообщения в виндусе рассылаются окнам, так?
у любого окна есть HWND, так?
значит и у TControl он есть
TMyControl = class (TControl)
private
procedure WMPaint(var AMessage: TWMPaint); message WM_PAINT;
end;
...
procedure TMyControl.WMPaint(var AMessage: TWMPaint);
begin
with ClientRect do
Rectangle(AMessage.DC, Left, Top, Right, Bottom);
end;
procedure TForm1.FormCreate(Sender: TObject);
var A: TMyControl;
begin
A := TMyControl.Create(Self);
A.Parent := Self;
A.BoundsRect := Rect(10, 10, 100, 100);
end;
в чем я не прав?
← →
NAlexey (2004-01-09 14:18) [26]>Я вот нашел такую функцию FindDragTarget,
Не будет она у тебя до конца хорошо работать, например с PageControl не будет.
← →
[lamer]Barmaglot (2004-01-09 14:18) [27]да-а-а-а... Дельфа как всегда выпендрелась...Действительно нет handle. Нет я понимаю, что так типа быстрее, но все равно мутно-о-о-о...
Это ещё один повод писать на WinAPI и не будет таких проблем.
← →
Тимохов (2004-01-09 14:19) [28][lamer]Barmaglot © (09.01.04 14:18) [27]
Не могу с вами согласиться. Без handle намного быстрее работать.
Вопрос знатокам! Кто тогда пересылает TLabel событие OnMouseEnter? Родитель?
← →
Mr. Chel (2004-01-09 14:22) [29]
> >Я вот нашел такую функцию FindDragTarget,
> Не будет она у тебя до конца хорошо работать, например с
> PageControl не будет.
Но работает же…
← →
[lamer]Barmaglot (2004-01-09 14:23) [30]Быстрее-ли? Delphi вообщето не предназначен для програмирования супербыстрых приложений. Для этого выбирают то, что хорошо работает с памятью - C++ или asm. А вот неудобство это создает. Хотя меня это не касается, я все равно давно уже пишу на чистом WinAPI.
← →
Тимохов (2004-01-09 14:24) [31]Судя по коду FindDragTarget должна работать.
И вроде как работает.
Вот ее код
function FindDragTarget(const Pos: TPoint; AllowDisabled: Boolean): TControl;
var
Window: TWinControl;
Control: TControl;
begin
Result := nil;
Window := FindVCLWindow(Pos);
if Window <> nil then
begin
Result := Window;
Control := Window.ControlAtPos(Window.ScreenToClient(Pos), AllowDisabled);
if Control <> nil then Result := Control;
end;
end;
Логично, что работает.
← →
Тимохов (2004-01-09 14:25) [32][lamer]Barmaglot © (09.01.04 14:23) [30]
Вы считаете, что дельфи плохо работает с памятью?
Первый раз слышу такое мнение...
← →
NAlexey (2004-01-09 14:26) [33]>Но работает же…
Повторю: например с PageControl не будет работать, берешь PageControl, кладешь на форму, добавляешь страницу наводишь мышь на участок межу переключалкой(то на что мышью нажимаешь чтобы переключать страницы), и пра воой границой PageControla, и видишь, что вродебы мышь над контролом а показывает что над формой... Инвизибле. Так что рекурсия, если реализуешь рекурсию, тоже хотелось бы посмотреть. Интересно. Мож кто выложит, поможет.
← →
MBo (2004-01-09 14:27) [34]>klyonov
Ты все-таки исследуй механизм работы VCL,начиная с TControl. Лучше всего - исходники, а также почитать Конопку.
Сообщения TLabel приходят путем диспетчеризации (например, форма определяет, что в точке клика находится Label, и пересылает сообщение ему методом Perform)
>NAlexey ©
Почему? Эта функция просто инкапсулирует в себе FindVCLWindow и CaontrolAtPos, и с PageControl на первый взгляд работает
>писать на WinAPI и не будет таких проблем
О каких проблемах идет речь? ;)
← →
Mr. Chel (2004-01-09 14:31) [35]
> NAlexey © (09.01.04 14:26) [33]
> >Но работает же…
> Повторю: например с PageControl не будет работать, берешь
> PageControl, кладешь на форму, добавляешь страницу наводишь
> мышь на участок межу переключалкой(то на что мышью нажимаешь
> чтобы переключать страницы), и пра воой границой PageControla,
> и видишь, что вродебы мышь над контролом а показывает что
> над формой... Инвизибле. Так что рекурсия, если реализуешь
> рекурсию, тоже хотелось бы посмотреть. Интересно. Мож кто
> выложит, поможет.
Понял. Но меня TabSheet не интересует мне надо только кнопки, списки, едиты и т.д. С этим вроде, как все чики-пики. :)
← →
NAlexey (2004-01-09 14:32) [36]>MBo ©
Смотрим FindDragTarget, как правильно написал Тимохов:
function FindDragTarget(const Pos: TPoint; AllowDisabled: Boolean): TControl;
var
Window: TWinControl;
Control: TControl;
begin
Result := nil;
Window := FindVCLWindow(Pos);
if Window <> nil then
begin
Result := Window;
Control := Window.ControlAtPos(Window.ScreenToClient(Pos), AllowDisabled);
if Control <> nil then Result := Control;
end;
end;
Смотрим FindVCLWindow:
function FindVCLWindow(const Pos: TPoint): TWinControl;
var
Handle: HWND;
begin
Handle := WindowFromPoint(Pos);
Result := nil;
while Handle <> 0 do
begin
Result := FindControl(Handle);
if Result <> nil then Exit;
Handle := GetParent(Handle);
end;
end;
Смотрим WindowFromPoint:
If the point is over a static text control, the return value is a handle to the window under the static text control.
Remarks
The WindowFromPoint function does not retrieve a handle to a hidden or disabled window, even if the point is within the window. An application should use the ChildWindowFromPoint function for a nonrestrictive search.
Так что не всегда будет работать...
← →
Игорь Шевченко (2004-01-09 14:39) [37]Тимохов © (09.01.04 14:19)
> Вопрос знатокам! Кто тогда пересылает TLabel событие OnMouseEnter?
>
TApplication.DoMouseIdle
← →
[lamer]Barmaglot (2004-01-09 14:40) [38]MBo © (09.01.04 14:27) [34]
О каких проблемах идет речь? ;)
О проблемах унификации :-). А то что мы тут выясняем, что для определенных элементов нельзя использовать стандартные подходы, это помоему минус. Нет если об этом помнить и вместо Tlabel использовать TStaticText(так кажется?), то все путем. Но непривычно както... А это помоему минус...
← →
DieHard (2004-01-09 14:50) [39]Свой инструмент надо знать. А если не знаешь, то, конечно, непривычно.
← →
[lamer]Barmaglot (2004-01-09 14:56) [40]Мой инструмент это WinAPI, остальное от лукавого :-)...
← →
Игорь Шевченко (2004-01-09 14:59) [41][lamer]Barmaglot © (09.01.04 14:56)
> Мой инструмент это WinAPI, остальное от лукавого
Времени у тебя много, завидно даже...;)
← →
[lamer]Barmaglot (2004-01-09 15:04) [42]В отличии от большинства здесь присутствующих, основная работа у меня связана с програмированием только косвенно. Так что выбираешь не то, что быстрее, а то что лучшее :-).
← →
Юрий Зотов (2004-01-09 15:04) [43]> [lamer]Barmaglot © (09.01.04 14:56) [40]
> Мой инструмент это WinAPI, остальное от лукавого
Сможете без "лукавого", пользуясь, ТОЛЬКО этим своим инструментом, определить, что мышь находится над TLabel, или TImage?
← →
NAlexey (2004-01-09 15:07) [44]Да, да. Мне тоже интересно.
← →
[lamer]Barmaglot (2004-01-09 15:10) [45]что за TLabel и TImage? В WinAPI такого нет...
← →
Юрий Зотов (2004-01-09 15:14) [46]> [lamer]Barmaglot © (09.01.04 15:10) [45]
А-а-а... ну тады вот другая задачка: таскать картинку мышкой по окну. Естественно, чтобы и полосы прокрутки вовремя включались/выключались, и чтобы работали они правильно.
← →
[lamer]Barmaglot (2004-01-09 15:20) [47]Бр-р-р-р чувствую себе как на экзамене...
Хотя Ваш вопрос странный. Вообщем-то помоему особых проблем быть не должно. мышь-WM_MouseMove, WM_LBUTTONUP и т.д. проверка места нажатие и вывод в во время WM_Paint в точке. Если картинка выходит за размеры окна, то ShowScrollBar, SCROLLINFO и т.д. Ну и прямые руки... Хотя может я подковырки не понял...
← →
Юрий Зотов (2004-01-09 15:28) [48]> [lamer]Barmaglot © (09.01.04 15:20) [47]
Что принципиальных проблем нет - это понятно. Проблема только одна - за неделю управитесь? С отладкой, в чистовом виде, конечно.
← →
NAlexey (2004-01-09 15:33) [49]> [lamer]Barmaglot ©
Соглашайся на TImage и TLabel, попроще будет:)
← →
[lamer]Barmaglot (2004-01-09 15:36) [50]Я же уже отвечал ([lamer]Barmaglot © (09.01.04 15:04) [42]), что в отличии от большинства здесь присутствующих я не являюсь профессионалом, поэтому вопрос времени у меня особо не стоит, стоит вопрос качества и интереса. Поэтому Ваша реплика не по адресу :-). (Хотя надо сказать что за неделю наверное управился бы, благо нароботки есть).
Для меня сложнее работа с ListView и TreeView, особенно когда за всю отрисовку отвечаю я + все данные храняться не внутри них а отдельно для скорости и экономии (данные часто дублируются). Вот тут могут быть сложности. А то что Вы говорите при желании наверное управился бы, вот только интереса нет...
← →
DieHard (2004-01-09 15:56) [51]
> вот только интереса нет...
Такая же фигня, поэтому и пользуемся возможностями, предоставляемыми инструментом.
← →
[lamer]Barmaglot (2004-01-09 16:10) [52]А вот я посмотрю как ты ту задачку про listView и TreeView решишь без WinAPI? :-).
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.011 c