FMX 的 Canvas 在不同的系统上会分别使用:
WinVista、Win7: D2D (FMX.Canvas.D2D.pas)
WinXP: GDI+ (FMX.Canvas.GDIP.pas)
Mac 系列: Core Graphics (FMX.Canvas.Mac.pas)
和 HTML5 中的 Canvas 非常类似, 现在的 Canvas 模糊了 Pen 的概念:
之前的 Canvas.Pen 对应: Canvas.Stroke;
之前的 Canvas.Brush 对应: Canvas.Fill.
在 FMX 中, Canvas 无处不在, 其 Canvas.Stroke、Canvas.Fill 的状态也各不相同, 一般要先初始化它们.
测试: 窗体上放 Button1、Panel1, 激活 Panel1 的 OnPaint 事件:
procedure TForm1.FormCreate(Sender: TObject); begin Self.OnPaint := Panel1.OnPaint; Button1.OnPaint := Panel1.OnPaint; Panel1.Opacity := 0.75; end; procedure TForm1.Panel1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin {画直线} Canvas.Stroke.Kind := TBrushKind.bkSolid; // Canvas.Stroke.Color := claBlack; Canvas.DrawLine(ARect.Location, ARect.BottomRight, 1); {填充椭圆} // Canvas.Fill.Kind := TBrushKind.bkSolid; Canvas.Fill.Color := claGreen; Canvas.FillEllipse(RectF(ARect.Width/5, ARect.Height/5, ARect.Width/5*4, ARect.Height/5*4), 1); end;
效果图:

绘图命令:
Canvas.DrawLine(); // Canvas.DrawRect(); //画矩形; 集合 TCorners: 四个角是否使用指定的样式类型; 枚举 TCornerType: 角样式类型 Canvas.DrawRectSides(); //画矩形边; 集合 TSides 指定要画的边 Canvas.DrawEllipse(); // Canvas.DrawArc(); // Canvas.DrawPath(); // Canvas.DrawBitmap(); // Canvas.DrawThumbnail(); //画略缩图 Canvas.DrawPolygon(); // Canvas.FillRect(); // Canvas.FillEllipse(); // Canvas.FillArc(); // Canvas.FillPath(); // Canvas.FillPolygon(); // Canvas.FillText(); // {测试文本输出} procedure TForm1.Panel1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin Canvas.Fill.Color := claRed; Canvas.Font.Size := 30; Canvas.FillText(ARect, '万一的 Delphi 博客', True, 1, [], TTextAlign.taLeading, TTextAlign.taCenter); end;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2008-11-14 Delphi 中的 IfThen 函数 - 回复 "深挖洞、广积粮" 的问题
2008-11-14 Delphi 的内存操作函数(5): 复制内存
2008-11-14 Delphi 的内存操作函数(4): 清空与填充内存