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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2024, 16:51   #1
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 142
Вопрос Delphi RAD 10.4 - событие для области TImage

Доброго времени!

Реально ли создать событие при входе мышки в НЕпрямоугольную область?

1) Для TImage
2) Для другого компонента
hexor_boo вне форума Ответить с цитированием
Старый 03.12.2024, 19:52   #2
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 142
По умолчанию

Вижу "сырое" решение - постоянно мониторить координаты мышки сразу после входа в TImage и как только мышь "зайдёт" в отслеживаемую область - создавать "OnRegionMouseEnter". Так в общих чертах. А возможно ли в режиме реального времени так отслеживать вход мышки в обозначенные координаты? Или есть другое, более изящное решение?

Последний раз редактировалось hexor_boo; 04.12.2024 в 00:53.
hexor_boo вне форума Ответить с цитированием
Старый 16.12.2024, 15:01   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,778
По умолчанию

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

Пример (на Лазарусе, но на Делфи примерно тоже самое):

Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Image1MouseLeave(Sender: TObject);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
      );
    procedure OnEnter(Sender: TObject);
    procedure OnLeave(Sender: TObject);
  private
    Enter: Boolean;
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

// Параметры окружности
const
  cx = 100;
  cy = 100;
  cr = 100;

procedure TForm1.FormShow(Sender: TObject);
begin
  // Рисуем окружность
  Image1.Canvas.Ellipse(cx - cr, cy - cr, cx + cr, cy + cr);
end;

// Обработка события попадания в заданную область
procedure TForm1.OnEnter(Sender: TObject);
begin
  Label1.Caption:='Внутри области';
end;

// Обработка события покидания заданной области
procedure TForm1.OnLeave(Sender: TObject);
begin
  Label1.Caption:='За пределами области';
end;

// Если вышли за пределы самого Image, то и внутреннюю область покинули
procedure TForm1.Image1MouseLeave(Sender: TObject);
begin
  if Enter then begin
    OnLeave(Sender);
    Enter := False;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Enter := False;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  // Проверяем попадание в заданную область (в данном случае окружность)
  if Sqrt(Sqr(x - cx) + Sqr(y - cy)) <= cr then begin
    if not Enter then begin
      OnEnter(Sender);
      Enter := True;
    end;
  end else begin
    if Enter then begin
      OnLeave(Sender);
      Enter := False;
    end;
  end;
end;

end.
Также можно определять область по цвету или любым другим требуемым способом.
Изображения
Тип файла: png 1.png (5.4 Кб, 26 просмотров)
Arigato вне форума Ответить с цитированием
Старый 18.12.2024, 03:30   #4
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 142
По умолчанию

Благодарю за подробный пример!
hexor_boo вне форума Ответить с цитированием
Старый 18.12.2024, 21:55   #5
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 142
По умолчанию

Возможно я неверно сформулировал задачу.

Нужно было: чтобы при заходе на непрозрачную область PNG-рисунка рисунок сменялся (как при событии захода мышки OnMouseEnter), а при выходе за пределы непрозрачной области менялся обратно (как при OnMouseLeave).

С помощью ChatGPT нашёл такое решение:

Код:
procedure TfrmMain.imgZabitMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 ZabitMouseMove(X, Y);
end;
Код:
 Procedure ZabitMouseMove(X : Integer; Y : Integer);
  Var
   Png        : TPngImage;
   AlphaValue : Byte;
   AlphaLine  : PByteArray;
  Begin

   If (frmMain.imgZabit.Picture.Graphic Is TPngImage) then
    Begin
    Png:=TPngImage(frmMain.imgZabit.Picture.Graphic);
     If (X>=0) And (Y>=0) And (X<Png.Width) And (Y<Png.Height) Then
      Begin
       AlphaLine:=Png.AlphaScanline[Y];

        If Assigned(AlphaLine) Then
         Begin
          AlphaValue:=AlphaLine[X];

           //0 - Transparent, 255 - Opaque
           If (AlphaValue>0) Then
            ZabitMouse(1) //установить картинку как при OnMouseEnter (вход в пределы рисунка)
           Else
            ZabitMouse(0); //установить картинку как при OnMouseLeave (выход за пределы рисунка)

         End;
      End;
    End;
  End;
hexor_boo вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отловить событие загрузки файла в TImage t232006 Компоненты Delphi 9 01.04.2024 00:59
[Delphi] Программа на одном из компьютеров не вызывает событие onPaint главной формы! Событие указано в дизайн тайм. Andru_ Общие вопросы Delphi 3 19.06.2019 21:00
Написать программу для определения принадлежности точки с координатами (х,у) заштрихованной области. Попадание на границу области sanek@zaputan Помощь студентам 5 09.03.2012 12:00
Проверить принадлежит ли точка закрашенной области, границе или находится вне области (код на Pascal) homk Помощь студентам 3 07.09.2011 23:16
TImage. Delphi PianeR Помощь студентам 2 02.02.2011 19:59