Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Координаты курсора и кнопки, определить? 
:(
    Опции темы
Marlin
Дата 3.3.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



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

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

И сравнить?
--------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает.
PM MAIL   Вверх
Guedda
Дата 3.3.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



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

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



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Marlin
Дата 3.3.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Нет так не пойдет. Я не использую этот обработчик.

вот мой код

Код


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> а результата не вижу.

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

Это сообщение отредактировал(а) Marlin - 3.3.2006, 10:57
--------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает.
PM MAIL   Вверх
Guedda
Дата 3.3.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



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


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Marlin
Дата 3.3.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



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

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

Это сообщение отредактировал(а) Marlin - 3.3.2006, 11:02
--------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает.
PM MAIL   Вверх
remax
Дата 3.3.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Цитата(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

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

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


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Marlin
Дата 3.3.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Я итак использую такие события. Специально разбирался с компонентами "спясибо винградцам помогли".

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

Так вот в самом обработчике мне нужно знать находится ли все еще курсор над кнопкой, если да я рекурсию использую, а если нет обработчик заканчивает свою работу
--------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает.
PM MAIL   Вверх
remax
Дата 3.3.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



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

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



--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Демо
Дата 3.3.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



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


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


--------------------
    
PM MAIL ICQ Skype   Вверх
Marlin
Дата 3.3.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Вот именно, я знаю как получить координаты мыши относительно экрана, а вот кнопки не знаю
--------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает.
PM MAIL   Вверх
remax
Дата 3.3.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



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

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


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
_hunter
Дата 3.3.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



о кнопки есть Left и Top относительно экрана. дальше продолжать?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
remax
Дата 3.3.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



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

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

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



--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Демо
Дата 3.3.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(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;




--------------------
    
PM MAIL ICQ Skype   Вверх
Marlin
Дата 3.3.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Hanter

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

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

Еще раз спасибо за пример
--------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.