4

我需要一个可以根据我的需要定制的可点击控件。从 Delphi 文档中,我收集到 TRectangle 可以。我需要以编程方式创建我的 TRectangles,所以我创建了一个表单、一个面板和一个按钮(参见下面的代码)。由于 TRectangle 是通过 TControl 的 TShape 派生的,因此我测试了是否可以使用 PaintTo 在 TRectangle 画布上绘制,使用它自己的画布。我构造的 TRectF 是在假设绘画相对于 TRectangle 的画布的情况下创建的,因此需要 (0, 0) 的偏移量。然而,矩形是在窗体的 (0, 0) 位置绘制的!没有注意我所做的 Fill 和 Stroke 属性的更改。

接下来我尝试了 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 //
4

1 回答 1

3

在 TRectangle 上绘制时,应该在 TRectangle 级别而不是Canvas 上访问画笔和笔触更改。在这种情况下,一切都按预期工作,绘制了 TRectangle 的 Canvas。

Key: TRectangle;
...
Key.Fill.Color := TAlphaColors.White;
Key.Fill.Kind := TBrushKind.bkSolid; // and not Key.Canvas.Fill ...
Key.Stroke.Thickness := 1;
Key.Stroke.Color := TAlphaColors.Darkgray;
Key.Paint;

为什么 TRectangle 在其 Canvas 上绘制时会在其 Parent.Parent 的画布上绘制(在这种情况下)击败我。也许它本身没有 Canvas 并且 TRectangle.Canvas 只是对其 Parent.Canvas 的引用?

于 2014-01-20T06:57:14.393 回答