我需要一個可以根據需要定製的可點擊控件。從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?任何想法可以分享?謝謝 –