2014-01-19 82 views
3

我需要一个可以根据需要定制的可点击控件。从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 // 

回答

3

当在TRectangle一个描绘应该访问的TRectangle水平和电刷和行程变化画布上。在这种情况下,所有工作都如预期的那样,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绘制其Parent.Parent的画布(在这种情况下)在其绘图画布时,我百思不得其解。也许它没有Canvas本身,而TRectangle.Canvas只是对其Parent.Canvas的引用?

+1

我有同样的需求,因为你有同样的问题,但是我已经试过您的解决方案和油漆,现在保护上XE5,我仍然得到我的运行时创建矩形没有颜色(保持透明)其他一切作品。你有没有尝试过XE5?任何想法可以分享?谢谢 –