Вместо этого рисунок на холсте заканчивается в форме
Я пытаюсь нарисовать некоторые пользовательские фигуры на холсте TImage, но вместо этого вывод заканчивается на холсте родительской формы TImage. Похоже, я должен преобразовать свои баллы из локального в абсолютный, чтобы сделать эту работу, но это также вызывает проблемы. Смотрите пример:
- Кто-нибудь знает, почему Image.Canvas.DrawArc (и т. Д.) Рисует относительно родительской формы, а не относительно изображения?
- Если я сталкиваюсь с проблемой.LocalToAbsolute... почему дуга выглядит так по-другому?
Проект прост: форма Firemonkey HD с TPanel в середине и TImage внутри TPanel (выровнена по клиенту). Кнопка просто выполняет код.
Вот код:
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
FMX.Objects;
type
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Canvas.BeginScene;
{Trying to draw arc and line on Image's canvas - Doesn't work; it draws to Form's canvas instead}
Image1.Canvas.DrawArc(PointF(0,0), PointF(10, 10), 0.0, 45.0, 1.0);
Image1.Canvas.DrawLine(PointF(0.0, 0.0), PointF(100, 100), 1.0);
{Trying to draw arc and line on Image's canvas - This works; by why should such steps be necessary and why is the arc so different?}
Image1.Canvas.DrawArc(Image1.LocalToAbsolute(PointF(0,0)), Image1.LocalToAbsolute(PointF(10, 10)), 0.0, 45.0, 1.0);
Image1.Canvas.DrawLine(Image1.LocalToAbsolute(PointF(0.0, 0.0)), Image1.LocalToAbsolute(PointF(100, 100)), 1.0);
Image1.Canvas.EndScene;
end;
end.
2 ответа
Как я уже упоминал ранее, это для XE5. Вот вам код:
procedure TForm3.Button1Click(Sender: TObject);
begin
Image1.Bitmap.Canvas.BeginScene;
{Trying to draw arc and line on Image's canvas - Doesn't work; it draws to Form's canvas instead}
Image1.Bitmap.Canvas.DrawArc(PointF(0,0), PointF(10, 10), 0.0, 145.0, 1.0);
Image1.Bitmap.Canvas.DrawLine(PointF(0.0, 0.0), PointF(200, 200), 1.0);
{Trying to draw arc and line on Image's canvas - This works; by why should such steps be necessary and why is the arc so different?}
Image1.Bitmap.Canvas.DrawArc(Image1.LocalToAbsolute(PointF(0,0)), Image1.LocalToAbsolute(PointF(10, 10)), 0.0, 45.0, 1.0);
Image1.Bitmap.Canvas.DrawLine(Image1.LocalToAbsolute(PointF(0.0, 0.0)), Image1.LocalToAbsolute(PointF(100, 100)), 1.0);
Image1.Bitmap.Canvas.EndScene;
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
Image1.Bitmap:=TBitmap.Create(trunc(image1.Width),trunc(image1.Height));
end;
Вы не вставили процедуру создания растрового изображения.
Ну, у меня тоже были некоторые проблемы с этим, и вы должны использовать растровое изображение, как сказал @LHristov. Единственное, что есть ошибка, которая неправильно устанавливает размер растрового изображения, и исправить это следующим образом:
procedure TForm3.FormCreate(Sender: TObject);
begin
bitmap := TBitmap.Create;
bitmap.SetSize(round(Image1.Width), round(Image1.Height));
Image1.MultiResBitmap.Bitmaps[1].Assign(bit);
Image1.Bitmap := Image1.MultiResBitmap.Bitmaps[1];
Image1.Bitmap.Clear(TAlphaColorRec.White);
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
Image1.Bitmap.Canvas.BeginScene;
Image1.Bitmap.Canvas.DrawArc(PointF(0,0), PointF(10, 10), 0.0, 145.0, 1.0);
Image1.Bitmap.Canvas.DrawLine(PointF(0.0, 0.0), PointF(200, 200), 1.0);
Image1.Bitmap.Canvas.DrawArc(Image1.LocalToAbsolute(PointF(0,0)), Image1.LocalToAbsolute(PointF(10, 10)), 0.0, 45.0, 1.0);
Image1.Bitmap.Canvas.DrawLine(Image1.LocalToAbsolute(PointF(0.0, 0.0)), Image1.LocalToAbsolute(PointF(100, 100)), 1.0);
Image1.Bitmap.Canvas.EndScene;
end;
Надеюсь, это решит это для вас!