为什么我需要在Delphi 2009中指定Canvas的字体来改变字体大小?

Pet*_*ner 6 delphi fonts delphi-2009

我有一个TPanel的子类,我非常非常喜欢我的懊恼,这样做的字体似乎永远不会采取:

font.size := AFontsize;
font.style := AFontStyle;
font.color := AFontColor;
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时它会改变:

Canvas.Font.Assign(Font);
Run Code Online (Sandbox Code Playgroud)

我没有在Delphi 7中这样做,但我似乎必须在2009年这样做.这是什么交易?

JRL*_*JRL 8

如果使用画布在面板中绘制文本,则必须设置画布字体.

某些组件和/或某些Delphi版本可以有意或者作为先前绘制任务的副作用设置Canvas.Font,但您不应该依赖它.

所以建议Canvas.Font := Font;在开始绘制文本之前先做.

这同样适用于Canvas.Brush和Canvas.Pen.

type
  TMyPanel = class(TCustomPanel)
  protected
    procedure Paint; override;
  end;

procedure TMyPanel.Paint;
var
  r: TRect;
begin
  r := ClientRect;

  Canvas.Brush.Color := Color;
  Canvas.FillRect(r); // fill the background

  Canvas.Font := Font;
  DrawText(Canvas.Handle, 'Sample Text', -1, r, DT_SINGLELINE or DT_CENTER or DT_VCENTER or DT_EXPANDTABS or DT_NOPREFIX);
end;
Run Code Online (Sandbox Code Playgroud)

  • @AndriyM:VCL通常使用`Canvas.Font:= Font`.因此它与使用`Assign`相同,因为`Font`属性的设置过程本身会执行`Assign`. (2认同)