为什么 TPanel.Canvas.Font 属性(通过受保护的 hack 访问)不同于 TPanel.Font 属性?
Why do TPanel.Canvas.Font properties (accessed with protected hack) differ from TPanel.Font properties?
我正在使用 Josef Švejk's excellent answer to the question How to draw text in a canvas vertical + horizontal with Delphi 10.2 中的 DrawTextRotatedB
函数
在 TPanel
.
上垂直绘制文本
该组件没有 public Canvas 属性,因此我使用受保护的 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);
该过程使用 ACanvas.Font
属性来使用 ACanvas.TextOut
绘制文本。
我注意到在过程中这些属性不是我所期望的,例如
PnlLeftLeft.Font.Size = 20
PnlLeftLeft.Font.Ttyle = [fsBold]
THackPanel(PnlLeftLeft).Canvas.Font.Size = 10
THackPanel(PnlLeftLeft).Canvas.Font.Ttyle = []
看来我可以很容易地 'fix' 在过程调用之前 THackPanel(PnlLeftLeft).Canvas.Font := PnlLeftLeft.Font;
这样做,
但我仍然有问题:
为什么 TPanel.Canvas.Font
属性不反映 TPanel.Font
属性?
这是设计使然。
一个复杂的控件可能会在不同的时间和位置使用不同的字体写入文本,因此 Canvas.Font
- 决定下一个文本绘制操作的字体 - 甚至在绘制单个“框架”。
另一方面,Self.Font
是控件的“主要字体”,通常显示在对象检查器中(作为已发布的 属性)并受 ParentFont
属性.
例如,控件的绘制代码可能会在每次调用开始时将 Self.Font
分配给 Canvas.Font
,然后可能会在绘制过程中稍微更改它(可能以斜体或粗体绘制某些部分或一些不同的颜色)。
我正在使用 Josef Švejk's excellent answer to the question How to draw text in a canvas vertical + horizontal with Delphi 10.2 中的 DrawTextRotatedB
函数
在 TPanel
.
上垂直绘制文本
该组件没有 public Canvas 属性,因此我使用受保护的 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);
该过程使用 ACanvas.Font
属性来使用 ACanvas.TextOut
绘制文本。
我注意到在过程中这些属性不是我所期望的,例如
PnlLeftLeft.Font.Size = 20
PnlLeftLeft.Font.Ttyle = [fsBold]
THackPanel(PnlLeftLeft).Canvas.Font.Size = 10
THackPanel(PnlLeftLeft).Canvas.Font.Ttyle = []
看来我可以很容易地 'fix' 在过程调用之前 THackPanel(PnlLeftLeft).Canvas.Font := PnlLeftLeft.Font;
这样做,
但我仍然有问题:
为什么 TPanel.Canvas.Font
属性不反映 TPanel.Font
属性?
这是设计使然。
一个复杂的控件可能会在不同的时间和位置使用不同的字体写入文本,因此 Canvas.Font
- 决定下一个文本绘制操作的字体 - 甚至在绘制单个“框架”。
Self.Font
是控件的“主要字体”,通常显示在对象检查器中(作为已发布的 属性)并受 ParentFont
属性.
例如,控件的绘制代码可能会在每次调用开始时将 Self.Font
分配给 Canvas.Font
,然后可能会在绘制过程中稍微更改它(可能以斜体或粗体绘制某些部分或一些不同的颜色)。