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



我使用的DrawTextRotatedB函数来自JosefŠvejk对如何使用Delphi 10.2在画布上垂直+水平绘制文本的出色回答在CCD_ 2上垂直绘制文本
该组件没有公共Canvas属性,所以我使用受保护的破解来访问它:

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);

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

PnlLeftLeft.Font.Size = 20
PnlLeftLeft.Font.Ttyle = [fsBold]
THackPanel(PnlLeftLeft).Canvas.Font.Size = 10
THackPanel(PnlLeftLeft).Canvas.Font.Ttyle = []

似乎我可以很容易地在过程调用之前"修复"CCD_ 5,但我仍然有一个问题:

为什么TPanel.Canvas.Font属性不镜像TPanel.Font属性?

这是经过设计的。

一个复杂的控件可能在不同的时间和位置用不同的字体编写文本,因此Canvas.Font——它指示下一次文本绘制操作的字体——甚至在绘制单个";帧";。

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

例如,控件的绘制代码可能在每次调用开始时将Self.Font分配给Canvas.Font,然后可能在绘制过程中对其进行轻微更改(可能用斜体、黑体或其他颜色绘制某些部分)。

最新更新