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

我使用的是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);

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

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

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

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

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

回答

这是设计使然。

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

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

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


以上是为什么TPanel.Canvas.Font属性(通过受保护的黑客访问)与TPanel.Font属性不同?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>