我使用的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
,然后可能在绘制过程中对其进行轻微更改(可能用斜体、黑体或其他颜色绘制某些部分)。