为什么 TPanel.Canvas.Font 属性(通过受保护的黑客访问)与 TPanel.Font 属性不同?

Jan*_*gen 2 delphi vcl canvas delphi-10.4-sydney

我使用的是DrawTextRotatedB从功能约瑟夫帅克出色的回答这个问题如何绘制文本与德尔福10.2帆布垂直+水平 对垂直绘制文本TPanel
该组件没有公共 Canvas 属性,所以我使用 protected hack 来访问它:

type
   THackPanel = class(TPanel);

DrawTextRotated(THackPanel(PnlLeftLeft).Canvas,90, PnlLeftLeft.Width DIV 2, cVertDrawOffset, FLeftVertText)

with definition

procedure DrawTextRotated(ACanvas: TCanvas; Angle, X, Y: Integer; AText: String);
Run Code Online (Sandbox Code Playgroud)

该过程使用ACanvas.Font属性来绘制文本ACanvas.TextOut
我注意到在程序内部这些属性不是我所期望的,例如

PnlLeftLeft.Font.Size = 20
PnlLeftLeft.Font.Ttyle = [fsBold]

THackPanel(PnlLeftLeft).Canvas.Font.Size = 10
THackPanel(PnlLeftLeft).Canvas.Font.Ttyle = []
Run Code Online (Sandbox Code Playgroud)

似乎我可以THackPanel(PnlLeftLeft).Canvas.Font := PnlLeftLeft.Font;在过程调用之前轻松“修复”这个问题,但我仍然有以下问题:

为什么TPanel.Canvas.Font属性不反映TPanel.Font属性?

And*_*and 5

这是设计使然。

一个复杂的控件可能会在不同的时间和位置用不同的字体编写文本,因此Canvas.Font——这决定了下一个文本绘制操作的字体——即使在绘制单个“框架”期间也可能会有所不同。

Self.Font,另一方面,是控件的“主要字体”,它通常显示在对象检查器中(作为已发布的属性)并受该ParentFont属性的影响。

例如,控件的绘制代码可能会在每次调用开始时分配Self.FontCanvas.Font,然后在绘制过程中可能会稍微更改它(可能以斜体或粗体或某些不同颜色绘制某些部分)。