Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2010, 16:19   #1
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию Обработчики событий мыши для компоненты Image

На форме есть Image1. Для него есть три обработчика события мыши:

Код:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbRight then flag:=true;  {если нажата правая кнопака,  глобальная переменная flag получает значение trye}
end;
Код:
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbRight then flag:=false;  {если кнопка отпущена, flag плучает значение false}
end;
Есть еще один обработчик Image1MouseMove. Там в зависимости от значения переменной flag проделывается ряд действий.

Мне нужно, чтобы когда я нажму правую кнопку мыши и не отпуская ее выведу курсор за пределы компоненты Image1 переменная flag получила значение false. Как это сделать???
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 21.07.2010, 16:52   #2
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

SetCapture(hwnd);

Но, увы. TImage окном не является, дескриптора не имеет, так что с ним такие фокусы не пройдут. Можно поискать другой компонент или переписать TImage как потомка TWinControl (смотри тут, http://programmersforum.ru/showthread.php?p=569062, только в данном случае ControlStyle менять не нужно)

Может быть ещё получится TImage'м накрыть TPanel и передавать клик ей, но это как-то некрасиво
пыщь

Последний раз редактировалось JTG; 21.07.2010 в 16:57.
JTG вне форума Ответить с цитированием
Старый 21.07.2010, 17:26   #3
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
SetCapture(hwnd);
можно про это по подробнее.
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 21.07.2010, 18:47   #4
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

В обработчике события MouseMove напишите

Код:
if (ssRight in Shift)and(( X <= Image1.Left)or(Y <= Image1.Top)or(X >= Image1.ClientWidth)or(Y >= Image1.ClientHeight)) then
  Flag := False;
Miha85193 вне форума Ответить с цитированием
Старый 21.07.2010, 19:22   #5
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Цитата:
Сообщение от Miha85193 Посмотреть сообщение
В обработчике события MouseMove напишите

Код:
if (ssRight in Shift)and(( X <= Image1.Left)or(Y <= Image1.Top)or(X >= Image1.ClientWidth)or(Y >= Image1.ClientHeight)) then
  Flag := False;
не работает
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 21.07.2010, 19:31   #6
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

А на чем у тебя Имеидж?
Miha85193 вне форума Ответить с цитированием
Старый 21.07.2010, 19:35   #7
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Form1. И к стати, Image может занимать всю клиентскую область формы.
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 21.07.2010, 19:52   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Пардон, думал наоборот нужно захватывать мышиный ввод после выхода за клиентскую облать.

Дописать обработчики onMouseEnter/onMouseLeave (в новых делфях они кажись есть и так), и повесить на onMouseLeave обнуление флага
http://programmersforum.ru/showpost....58&postcount=9
пыщь
JTG вне форума Ответить с цитированием
Старый 21.07.2010, 20:27   #9
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Don Karleone Посмотреть сообщение
не работает
Тогда ничего не остается, как бросить на форму таймер и написать в onTimer следующее:

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Left_Top_Screen, Right_Bottom_Screen: TPoint; // координаты относительно клиентской области
begin
  // Узнаем координаты Имеиджа относительно левого верхнего угла экрана
  Left_Top_Screen := ClientToScreen(Image1.ClientRect.TopLeft);
  Right_Bottom_Screen  := ClientToScreen(Image1.ClientRect.BottomRight);
  
  if (( Mouse.CursorPos.X <= Left_Top_Screen.X)or
      (Mouse.CursorPos.Y <= Left_Top_Screen.Y)or(Mouse.CursorPos.X >= Right_Bottom_Screen.X)or(Mouse.CursorPos.Y >= 

Right_Bottom_Screen.Y)) then
    MessageBeep(MB_ICONEXCLAMATION);
end;
Mouse.CursorPos.X и Mouse.CursorPos.Y - координаты курсора относительно экрана
ClientToScreen - функция, которая переводит координаты клиентской области в координаты экрана.
Тип результата функции - TPoint.

Последний раз редактировалось Miha85193; 22.07.2010 в 08:43.
Miha85193 вне форума Ответить с цитированием
Старый 21.07.2010, 21:30   #10
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Пардон, думал наоборот нужно захватывать мышиный ввод после выхода за клиентскую облать.

Дописать обработчики onMouseEnter/onMouseLeave (в новых делфях они кажись есть и так), и повесить на onMouseLeave обнуление флага
http://programmersforum.ru/showpost....58&postcount=9
Да, да, да... Это я знаю Только я пишу в Delphi 7 и очень хочется разобраться, как это можно реализовать там
А как можно получить позицию курсора относительно всего экрана? Если конечно такое возможно.
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват событий клавиатуры и мыши (X system) damned20 Qt и кроссплатформенное программирование С/С++ 4 26.02.2010 12:18
Перехват событий клавиатуры и мыши (X system) damned20 Общие вопросы C/C++ 0 25.02.2010 09:40
HTML нет событий при передачи методо POST через <input type="image" Mixail HTML и CSS 12 07.06.2009 03:33
Обработчики событий формы Alexei_1986 Помощь студентам 5 18.02.2009 22:11