Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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, остальное от лукавого :-)...



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

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

Наверх




Память: 0.54 MB
Время: 0.01 c
1-63123
C0rWin
2004-01-10 19:36
2004.01.20
Изменение стилей на лету.


1-63203
vgb
2004-01-10 00:09
2004.01.20
TWebBrowser


1-63120
MakNik
2004-01-05 14:43
2004.01.20
Сколько дней и выходных в году и в определенном месяце?


14-63381
Hitman
2003-12-29 11:45
2004.01.20
Цвет выделения


14-63297
kaif
2003-12-27 03:32
2004.01.20
Что означает верить в себя?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский