Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Координаты курсора и кнопки


Автор: Marlin 3.3.2006, 10:36
Такая проблема. Как можно вычислить, в определенное время находится ли курсор мыши над кнопкой по координатам

с курсором мыши все ясно GetCursorPos(P:TPoint). Тем самым получаю координаты мыши. А вот с кнопкой как быть?

И сравнить?

Автор: Guedda 3.3.2006, 10:39
А что тут делать? Обрабатываешь движение мыши по кнопке, и все.
Код

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  P : TPoint;
begin
  GetCursorPos(P);
end;

Автор: Marlin 3.3.2006, 10:50
Нет так не пойдет. Я не использую этот обработчик.

вот мой код

Код


procedure TForm1.ButtonMouseMove1MouseEnter(sender: TObject); //событие моего компонента на вхождение курсора в область кнопки
var
jpeg: TJPEGImage;
bm : TBitmap;
tt:Cardinal;
i:byte;
myfile:string;
p1,p2:TPoint;
bo:boolean;

begin

bo:=false;

for I:=1 to 3 do
begin
  myfile:='';
  myfile:=myfile+IntToStr(i)+'.jpg';
  tt:=GetTickCount;
  While GetTickCount<(tt+300) do
    begin
    end;

    bm:=TBitmap.Create;
    jpeg := TJPEGImage.Create;
    jpeg.CompressionQuality := 100; {Default Value}
    jpeg.LoadFromFile(myfile);
    bm.Assign(jpeg);
    ButtonMouseMove1.Glyph.Assign(bm);
    application.ProcessMessages;
    bm.Free;
    jpeg.Free;
end;

//проверка: находится ли курсор над кнопкой если да тогда
bo:=true;

if bo=true then
ButtonMouseMove1MouseEnter(sender);//рекурсия


Добавлено @ 10:51
Что-то не пойму пользуюсь тегом, <code> </code> а результата не вижу.

И кнопки редактирования у меня не отображаются

Автор: Guedda 3.3.2006, 10:55
Используй не <code> а [соde], т.е. Квадратные скобки ставь.
Ну и в чем проблема по кнопке?

Автор: Marlin 3.3.2006, 11:02
Кнопки на форуме, которые вставляют теги - они не отображаются в браузере MOZILA

если ты про эти кнопки спрашиваешь

Автор: remax 3.3.2006, 11:04
Цитата(Marlin @ 3.3.2006, 07:50)
//проверка: находится ли курсор над кнопкой если да тогда
bo:=true;

if bo=true then
ButtonMouseMove1MouseEnter(sender);//рекурсия

????


1) Все потомки TComponent могут посылать сообщения CMMouseEnter,CMMouseLeave во время пересечения курсором мыши границ компонента. Надо только правильно их обработать. Вручную, как у Вас, делать ничего не надо.
2) Предусмотрена стандартная обработка в виде события MouseMove, которое возникает только при перемещении мыши над компонентом! см. что написал Guedda.
Добавлено @ 11:05
Цитата(Marlin @ 3.3.2006, 08:02)
Кнопки на форуме, которые вставляют теги - они не отображаются в браузере MOZILA

если ты про эти кнопки спрашиваешь

А отображение рисунков - включено?

Автор: Marlin 3.3.2006, 11:09
Я итак использую такие события. Специально разбирался с компонентами "спясибо винградцам помогли".

В итоге написал компонент, который обрабатывает эти события. Но дело в том, что в процедуре обработчике я использую рекурсию обновления картинок. "см. код выше"

Так вот в самом обработчике мне нужно знать находится ли все еще курсор над кнопкой, если да я рекурсию использую, а если нет обработчик заканчивает свою работу

Автор: remax 3.3.2006, 11:15
Используй логическую переменную, в которую автоматически по событиям или обработкой сообщений заноси значения:
- при входе курсора мыши, по сообщению CM_MouseEnter - true
- при выходе курсора мыши, по сообщению CM_MouseLeave - false

И анализируй только содержимое этой переменной!

Автор: Демо 3.3.2006, 11:18
Цитата(Marlin @ 3.3.2006, 11:09 Найти цитируемый пост)
Так вот в самом обработчике мне нужно знать находится ли все еще курсор над кнопкой, если да я рекурсию использую, а если нет обработчик заканчивает свою работу


Так а в чем проблема? У тебя координаты кнопки неизвестны?

Автор: Marlin 3.3.2006, 11:21
Вот именно, я знаю как получить координаты мыши относительно экрана, а вот кнопки не знаю

Автор: remax 3.3.2006, 11:24
Цитата(Marlin @ 3.3.2006, 08:09)
Так вот в самом обработчике мне нужно знать находится ли все еще курсор над кнопкой, если да я рекурсию использую, а если нет обработчик заканчивает свою работу

Или используй логический цикл, внутри обработчика или оформи как отдельную процедуру. Не очень красиво и правильно в данном случае использовать рекурсивный вызов обработчика - запутанно и загаживается стек. Если курсор мыши остается над кнопкой достаточно долго - Ваша программа будет вылетать по ошибке. Нет, однозначно только логический цикл! smile

Автор: _hunter 3.3.2006, 11:24
о кнопки есть Left и Top относительно экрана. дальше продолжать?

Автор: remax 3.3.2006, 11:26
Цитата(Marlin @ 3.3.2006, 08:21)
Вот именно, я знаю как получить координаты мыши относительно экрана, а вот кнопки не знаю

Левый верхний угол
x=Button1.left
y=Button1.Top

Правый нижний угол
x=Button1.left+Button1.Width
y=Button1.Top+Button1.Height

Автор: Демо 3.3.2006, 11:28
Цитата(Marlin @ 3.3.2006, 11:21 Найти цитируемый пост)
Вот именно, я знаю как получить координаты мыши относительно экрана, а вот кнопки не знаю


Ясно.

Держи пример.

Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
  P,P1: TPoint;
  OverButton: Boolean;
begin
  GetCursorPos(P);
  Label1.Caption :=
    IntToStr(P.X)+'/'+IntToStr(P.Y);

  P1 := ScreenToClient(P);
  Label2.Caption :=
    IntToStr(P1.X)+'/'+IntToStr(P1.Y);

  OverButton :=
    ((P1.X>Button1.Left) and (P1.X<Button1.Left+Button1.Width)) and
    ((P1.Y>Button1.Top) and (P1.Y<Button1.Top+Button1.Height));

  if OverButton
    then Label3.Caption := 'Курсор над кнопкой'
    else Label3.Caption := 'Курсор не над кнопкой';

end;


Автор: Marlin 3.3.2006, 11:32
Hanter

Я думал Left и Top это относительно формы

за пример спасибо сейчас испробую.
Добавлено @ 11:35
Спасибо все работает?

Еще раз спасибо за пример

Автор: _hunter 3.3.2006, 12:15
murlin

смотря что ты понимаеш под экраном. но никто не мешает тебе приплюсовать еще и Left и Top формы...

Автор: Guedda 3.3.2006, 12:17
Можно сделать так:
Код

//узнаем Left кнопки относительно экрана
MyLeft := Form1.Left+Button1.Left;
//узнаем Top кнопки относительно экрана
MyTop := Form1.Top + Button1.Top;

Автор: Tkashey 22.3.2007, 21:39
Блин, читал читал я эту статью да так и не понял как определить координаты курсора мыши над компонентом в системе координат компонента (компонент не знает где он создан - то ли просто на форме то ли на наложеных друг на друга панелях)? (Указанные _hunter'ом методы компонентов left и top выдают координаты левого верхнего угла всё-таки в системе координат родительского компонента, а функция GetCursorPos(P) объекта Mouse в системе координат экрана)
объясните пож. как решить эту проблему

Автор: VICTAR 22.3.2007, 22:42
Ну что-нибудь типа такого (три панели разных размеров лежат друг на друге)
Код

procedure TForm1.Panel3MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var Rct: TRect;
begin
GetWindowRect(Panel3.Handle, Rct);
Caption:=Format('x=%d; y=%d', [Rct.Left+x, Rct.Top+y]);
end;


Пример в атаче

Автор: Tkashey 22.3.2007, 23:34
Спасибо, пример ясен

а как в следующем обработчике я могу получить координаты мыши x,y? (в системе координат компонента, без использования GetWindowRect), т.е. что и куда нужно добавить? 

Код

...
procedure WMMouseMove(var Msg: TMouseMoveEvent); message WM_MOUSEMOVE;
...
procedure TPField.WMMouseMove(var Msg: TMouseMoveEvent);
begin
... {здесь используются x,y}
end;
...

Автор: VICTAR 22.3.2007, 23:37
Заходи еще  smile 

Автор: VICTAR 23.3.2007, 21:19
либо так
Код

procedure WMMouseMove(var Msg: TWMMouseMove); message WM_MOUSEMOVE;
...
var x,y: integer;
...
procedure TForm1.WMMouseMove(var Msg: TWMMouseMove);
begin
 x:=Msg.XPos;
 y:=Msg.YPos;
 Caption:=Format('x=%d; y=%d', [x,y]);
end;  

либо так
Код

procedure WMMouseMove(var Msg: TMessage); message WM_MOUSEMOVE;
...
var x,y: integer;
...
procedure TForm1.WMMouseMove(var Msg: TMessage);
begin
 x:=LOWORD(Msg.LParam);
 y:=HIWORD(Msg.LParam);
 Caption:=Format('x=%d; y=%d', [x,y]);
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)