Jan*_*gen 2 delphi vcl canvas delphi-10.4-sydney
我使用的是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);
Run Code Online (Sandbox Code Playgroud)
该过程使用ACanvas.Font属性来绘制文本ACanvas.TextOut。
我注意到在程序内部这些属性不是我所期望的,例如
PnlLeftLeft.Font.Size = 20
PnlLeftLeft.Font.Ttyle = [fsBold]
THackPanel(PnlLeftLeft).Canvas.Font.Size = 10
THackPanel(PnlLeftLeft).Canvas.Font.Ttyle = []
Run Code Online (Sandbox Code Playgroud)
似乎我可以THackPanel(PnlLeftLeft).Canvas.Font := PnlLeftLeft.Font;在过程调用之前轻松“修复”这个问题,但我仍然有以下问题:
为什么TPanel.Canvas.Font属性不反映TPanel.Font属性?
这是设计使然。
一个复杂的控件可能会在不同的时间和位置用不同的字体编写文本,因此Canvas.Font——这决定了下一个文本绘制操作的字体——即使在绘制单个“框架”期间也可能会有所不同。
Self.Font,另一方面,是控件的“主要字体”,它通常显示在对象检查器中(作为已发布的属性)并受该ParentFont属性的影响。
例如,控件的绘制代码可能会在每次调用开始时分配Self.Font给Canvas.Font,然后在绘制过程中可能会稍微更改它(可能以斜体或粗体或某些不同颜色绘制某些部分)。