如何在 FMX canvas 上以 Delphi 画线
How to draw a line in Delphi on an FMX canvas
这是 Delphi 柏林 10.1 更新 2
以下作品(我画了一条线):
brush := TStrokeBrush.Create(TBrushKind.Solid, TAlphaColors.Lightgray);
brush.Thickness := 2;
with Canvas do
begin
BeginUpdate;
DrawLine(PointF(10, 10), PointF(100, 10), 1, brush);
EndUpdate;
end;
以下无效:
with Canvas do
begin
BeginUpdate;
Stroke.Color := TAlphaColors.Black;
Stroke.Thickness := 2.0;
DrawLine(PointF(10, 10), PointF(100, 10), 1);
EndUpdate;
end;
为什么我不能使用第二个?我怎样才能让它工作,或者我应该像第一个例子那样坚持创建一个笔刷?
我已经包含了一个最小的应用程序:
main.pas
unit main;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects;
type
TMainForm = class(TForm)
PaintBox: TPaintBox;
procedure OnPaint(Sender: TObject; Canvas: TCanvas);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.fmx}
procedure TMainForm.OnPaint(Sender: TObject; Canvas: TCanvas);
begin
with Canvas do
begin
BeginUpdate;
Stroke.Color := TAlphaColors.Black;
Stroke.Thickness := 2.0;
DrawLine(PointF(10, 10), PointF(100, 10), 1);
EndUpdate;
end;
end;
end.
main.fmx:
object MainForm: TMainForm
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 480
ClientWidth = 640
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
DesignerMasterStyle = 0
object PaintBox: TPaintBox
Position.X = 16.000000000000000000
Position.Y = 16.000000000000000000
Size.Width = 609.000000000000000000
Size.Height = 449.000000000000000000
Size.PlatformDefault = False
OnPaint = OnPaint
end
end
test.dpr:
program test;
uses
System.StartUpCopy,
FMX.Forms,
main in 'main.pas' {MainForm};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
Delphi 的早期版本根据平台对 Stroke.Kind 有不同的默认值。
从 Delphi 10.1 Berlin 开始,所有平台的默认值似乎都是 None
。 (感谢@TomBrunberg)
要显示该行,请设置 Stroke.Kind := TBrushKind.Solid;
注意:在 Windows 8.1
上测试
我还创建了一个新的 Metropolis FMX 应用程序,其中绘图在没有设置 Stroke.Kind
的情况下工作。虽然无法解释。
QP 提交了一份类似的报告,RSP-16313
Canvas.DrawLine 不适用于 Windows XP(32 位)格式 。这里的问题出现在 Windows-XP 而不是 Windows-7。
很奇怪,第一个案例是有效的。
你应该使用描边笔刷。
并且您应该使用 BeginScene 和 EndScene 而不是 BeginUpdate 和 EndUpdate。此片段完美运行:
Brush := TStrokeBrush.Create(TBrushKind.Solid, TAlphaColors.Black);
Brush.Thickness := 2;
with Canvas do
begin
BeginScene();
DrawLine(PointF(10, 10), PointF(100, 10), 1, Brush);
EndScene;
end;
这是 Delphi 柏林 10.1 更新 2
以下作品(我画了一条线):
brush := TStrokeBrush.Create(TBrushKind.Solid, TAlphaColors.Lightgray);
brush.Thickness := 2;
with Canvas do
begin
BeginUpdate;
DrawLine(PointF(10, 10), PointF(100, 10), 1, brush);
EndUpdate;
end;
以下无效:
with Canvas do
begin
BeginUpdate;
Stroke.Color := TAlphaColors.Black;
Stroke.Thickness := 2.0;
DrawLine(PointF(10, 10), PointF(100, 10), 1);
EndUpdate;
end;
为什么我不能使用第二个?我怎样才能让它工作,或者我应该像第一个例子那样坚持创建一个笔刷?
我已经包含了一个最小的应用程序:
main.pas
unit main;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects;
type
TMainForm = class(TForm)
PaintBox: TPaintBox;
procedure OnPaint(Sender: TObject; Canvas: TCanvas);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.fmx}
procedure TMainForm.OnPaint(Sender: TObject; Canvas: TCanvas);
begin
with Canvas do
begin
BeginUpdate;
Stroke.Color := TAlphaColors.Black;
Stroke.Thickness := 2.0;
DrawLine(PointF(10, 10), PointF(100, 10), 1);
EndUpdate;
end;
end;
end.
main.fmx:
object MainForm: TMainForm
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 480
ClientWidth = 640
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
DesignerMasterStyle = 0
object PaintBox: TPaintBox
Position.X = 16.000000000000000000
Position.Y = 16.000000000000000000
Size.Width = 609.000000000000000000
Size.Height = 449.000000000000000000
Size.PlatformDefault = False
OnPaint = OnPaint
end
end
test.dpr:
program test;
uses
System.StartUpCopy,
FMX.Forms,
main in 'main.pas' {MainForm};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
Delphi 的早期版本根据平台对 Stroke.Kind 有不同的默认值。
从 Delphi 10.1 Berlin 开始,所有平台的默认值似乎都是 None
。 (感谢@TomBrunberg)
要显示该行,请设置 Stroke.Kind := TBrushKind.Solid;
注意:在 Windows 8.1
上测试我还创建了一个新的 Metropolis FMX 应用程序,其中绘图在没有设置 Stroke.Kind
的情况下工作。虽然无法解释。
QP 提交了一份类似的报告,RSP-16313 Canvas.DrawLine 不适用于 Windows XP(32 位)格式 。这里的问题出现在 Windows-XP 而不是 Windows-7。
很奇怪,第一个案例是有效的。
你应该使用描边笔刷。
并且您应该使用 BeginScene 和 EndScene 而不是 BeginUpdate 和 EndUpdate。此片段完美运行:
Brush := TStrokeBrush.Create(TBrushKind.Solid, TAlphaColors.Black);
Brush.Thickness := 2;
with Canvas do
begin
BeginScene();
DrawLine(PointF(10, 10), PointF(100, 10), 1, Brush);
EndScene;
end;