gpt4 book ai didi

delphi - 为什么 TPanel.Canvas.Font 属性(通过 protected hack 访问)与 TPanel.Font 属性不同?

转载 作者:行者123 更新时间:2023-12-02 02:25:06 31 4
gpt4 key购买 nike

我正在使用 Josef Švejk's excellent answer 中的 DrawTextRotatedB 函数对于问题How to draw text in a canvas vertical + horizontal with Delphi 10.2TPanel 上垂直绘制文本。
该组件没有公共(public) 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.Font 分配给 Canvas.Font,然后可能在绘画过程中稍微改变它(也许是用斜体、粗体或其他颜色绘制某些部分)。

关于delphi - 为什么 TPanel.Canvas.Font 属性(通过 protected hack 访问)与 TPanel.Font 属性不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65798888/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com