Перейти к содержанию
Fire Monkey от А до Я
  • 0

рисование на Image1


лёля

Вопрос

Неполучеться осущетсвить что-то вроде карандаша чтобы рисовать на Image1 вот код

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects,
  FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    StyleBook1: TStyleBook;
    Image1: TImage;
    Image2: TImage;
    Label1: TLabel;
    procedure Image2Click(Sender: TObject);
    procedure Image1Paint(Sender: TObject; Canvas: TCanvas;
      const ARect: TRectF);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Single);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 const
 R=80;
var
  Form1: TForm1;
  D:integer;
  PA:TPathData;
  p1,p2,p3,p4:TPointF;
implementation

{$R *.fmx}

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Single);
begin
if D=1 then
begin
  Image2.Position.X:=x;
  Image2.Position.Y:=y;

end;
end;

procedure TForm1.Image1Paint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
begin
if D=1 then
begin
 p1:=PointF(Image1.Position.X,Image1.Position.Y);


  Pa:=TPathData.Create;
  Pa.MoveTo(p1);
   Image2.Bitmap.Canvas.BeginScene;
  Image2.Bitmap.Canvas.Stroke.Color:=TAlphaColorRec.Green;
  Image2.Bitmap.Canvas.Stroke.Thickness:=1;//PenWidth;
  Image2.Bitmap.Canvas.DrawPath(Pa,1.0);
  Image2.Bitmap.Canvas.EndScene;
  Pa.Free;


  Image2.Bitmap.Canvas.EndScene;

Image1.Canvas.EndScene;
end;
end;

procedure TForm1.Image2Click(Sender: TObject);
begin
 if D=0 then
 begin

 D:=1;
 end
 else
 begin
  D:=0;
 end;

end;

end.
 

Изменено пользователем лёля
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

А этот код и не должен ничего рисовать.

  1. Почитайте про TPathData и его методы (хотя бы MoveTo и LineTo)
  2. У одного Canvas должно быть одинаковое количество BeginScene и EndScene - иначе получите Exception.
  3. В Image1MouseMove вообще не понятно что Вы хотели сделать.
Ссылка на комментарий
  • 0
51 минуту назад, dnekrasov сказал:

А этот код и не должен ничего рисовать.

  1. Почитайте про TPathData и его методы (хотя бы MoveTo и LineTo)
  2. У одного Canvas должно быть одинаковое количество BeginScene и EndScene - иначе получите Exception.
  3. В Image1MouseMove вообще не понятно что Вы хотели сделать.

 Image2 в качестве карандаша использовать.

Ссылка на комментарий
  • 0
8 минут назад, лёля сказал:

Image2 в качестве карандаша использовать

Если в качестве курсора (картинки) карандаша, то ещё следует изучить как преобразовывать координаты:

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Single);
begin
  if D=1 then
    Image2.Position.Point := Image1.LocalToAbsolute(PointF(X, Y));
end;

Да и HitTest у Image2 следует поставить False, а клик отслеживать на Image1. Да и когда D=1 и курсор находится внутри Image1 курсор мышки лучше сделать невидимым.

Да и вообще - рисовать удобнее на PaintBox

Ссылка на комментарий
  • 0

посмотрела TPathData  Нашла вот что 

Path3D1->Path->Clear();
Path3D1->Path->MoveTo(TPointF(0,0));
Path3D1->Path->LineTo(TPointF(100, 200));
Path3D1->Path->ClosePath();

 непоняла почему

Path->MoveTo(TPointF(0,0))  TPointF х=0 у=0 а

Path->LineTo(TPointF(100, 200)); TPointF х=100 у=200 

Изменено пользователем лёля
Ссылка на комментарий
  • 0
15 часов назад, лёля сказал:

непоняла почему

Сначала указываем точку, из которой будем начинать рисовать (MoveTo) - затем указываем точку (или несколько), которые описывают рисуемую фигуру (для LineTo это точка в которою надо провести линию)

Ссылка на комментарий
  • 0

получаеться у меня согласно этому 

Path3D1->Path->MoveTo(TPointF(0,0));
Path3D1->Path->LineTo(TPointF(100, 200));

 p1:=PointF(Image1.Position.X,Image1.Position.Y);  p2:=PointF(Image1.Position.X,Image1.Position.Y);

Image1->Path->MoveTo(TPointF(Image2.Position.X,Image2.Position.Y)); Image1->Path->LineTo(TPointF(Image2.Position.X, Image2.Position.Y));

 

Изменено пользователем лёля
Ссылка на комментарий
  • 0
1 час назад, лёля сказал:

Image1->Path->LineTo(TPointF(Image2.Position.X, Image2.Position.Y));

Сюда вместо Image2.Position.X, Image2.Position.Y подставлять преобразованные координаты Х, Y из 

 

В 20.04.2019 в 19:39, dnekrasov сказал:

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);

 

Ссылка на комментарий
  • 0

кое-что удалось исправить но не рисует

unit Canvas;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects,
  FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Button1: TButton;
    procedure Image2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Single);
    procedure Image2MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Single);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Single);
    procedure Button1Click(Sender: TObject);
    procedure Image2Click(Sender: TObject);
    procedure Image1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
 D,D1,X,X1,Y,Y1:integer;

  PA:TPathData;
  p1,p2,p3,p4:TPointF;
implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
if D1=1 then
begin
D1:=0;
label5.Text:=D1.ToString();
Image2.Visible:=false;
end
else
begin
D1:=1;
label5.Text:=D1.ToString();
end;
end;

procedure TForm1.Image1Click(Sender: TObject);
begin

end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Single);
begin
  if D1=1 then
begin
Image2.Position.X:=x;
Image2.Position.Y:=y;
Image2.Visible:=true;
end
else
begin
Image2.Position.X:=Image2.Position.X;
Image2.Position.Y:=Image2.Position.Y;

end;
end;

procedure TForm1.Image2Click(Sender: TObject);
begin
Pa:=TPathData.Create;
  p1:=PointF(strtoint(Label1.Text),strtoint(Label2.Text));
  p2:=PointF(strtoint(Label3.Text),strtoint(Label4.Text));
  Pa.MoveTo(p2);
  Pa.LineTo(p2);
   Image2.Bitmap.Canvas.BeginScene;
  Image2.Bitmap.Canvas.Stroke.Color:=TAlphaColorRec.Green;
  Image2.Bitmap.Canvas.Stroke.Thickness:=1;//PenWidth;
  Image2.Bitmap.Canvas.DrawPath(Pa,1.0);
  Image2.Bitmap.Canvas.EndScene;
end;

procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
Label3.Text:=Image2.Position.X.ToString;
Label4.Text:=Image2.Position.Y.ToString;
end;

procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
Label1.Text:=Image2.Position.X.ToString;
Label2.Text:=Image2.Position.Y.ToString;


end;

end.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...