我需要一个可以根据需要定制的可点击控件。从Delphi文档中我收集到一个TRectangle会做的事情。我需要以编程方式创建我的TRectangles,所以我创建了一个Form,一个Panel和一个Button(请参阅下面的代码)。由于TRectangle是通过TControl的TShape派生的,我测试了是否可以使用PaintTo使用自己的画布在TRectangle画布上绘制。我构建的TRectF是在假设绘画将相对于TRectangle的画布的情况下创建的,因此需要(0,0)的偏移量。然而,该矩形被绘制在Form的位置(0,0)处!没有注意到我所做的填充和笔画属性的变化。如何在Trectangle的画布上绘画
我接下来尝试了一个FillRect,并再次得到相同的结果,虽然使用了正确的填充。虽然调用来自Trectangle变量.Canvas.FillRect,但它总是相对于树中最高的父元素,绕过TRectangle和TPanel。我一直认为绘画是与Canvas属于TControl的坐标相关的。
这是错误的还是TRectangle有什么特别的?在TRectangle上有更好的绘画方法吗?
unit rect_test_main;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Objects;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure Button1Click (Sender: TObject);
procedure FormCreate (Sender: TObject);
protected
FR: TRectangle;
public
procedure draw_paintto (rect: TRectangle);
procedure draw_rect (rect: TRectangle);
procedure draw_fill (rect: TRectangle);
procedure draw (surface: TControl);
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.FormCreate (Sender: TObject);
begin
FR := Trectangle.Create (Panel1);
FR.Parent := Panel1;
FR.Canvas.BeginScene;
FR.Canvas.Fill.Color := TAlphaColors.Black;
FR.Canvas.Stroke.Color := TAlphaColors.Green;
FR.SetBounds (200, 200, 50, 300);
FR.OnClick := Button1Click;
FR.Canvas.EndScene;
end; // FormCreate //
procedure TForm1.Button1Click (Sender: TObject);
begin
draw_fill (FR);
end;
procedure TForm1.draw_paintto (rect: TRectangle);
var
r: TRectF;
begin
FR.Canvas.BeginScene;
FR.Canvas.Fill.Color := TAlphaColors.Black;
FR.Canvas.Stroke.Color := TAlphaColors.Green;
FR.Canvas.Stroke.Thickness := 10;
r := rect.ShapeRect;
// r := TRectF.Create (TPointF.Create (FR.Position.X - 10, FR.Position.Y - 10), FR.Width, FR.Height);
FR.PaintTo (FR.Canvas, r, FR.Parent);
FR.Canvas.EndScene;
end; // draw_paintto //
procedure TForm1.draw_fill (rect: TRectangle);
var
r: TRectF;
begin
FR.Canvas.BeginScene;
FR.Canvas.Fill.Color := TAlphaColors.Black;
FR.Canvas.Stroke.Color := TAlphaColors.Green;
FR.Canvas.Stroke.Thickness := 10;
r := TRectF.Create (TPointF.Create (FR.Position.X, FR.Position.Y), FR.Width, FR.Height);
FR.Canvas.FillRect (r, 0, 0, AllCorners, 1);
FR.Canvas.EndScene;
end; // draw_fill //
我有同样的需求,因为你有同样的问题,但是我已经试过您的解决方案和油漆,现在保护上XE5,我仍然得到我的运行时创建矩形没有颜色(保持透明)其他一切作品。你有没有尝试过XE5?任何想法可以分享?谢谢 –