为什么我需要分配画布';s字体在Delphi 2009中更改字体大小?

为什么我需要分配画布';s字体在Delphi 2009中更改字体大小?,delphi,fonts,delphi-2009,Delphi,Fonts,Delphi 2009,我有一个TPanel的子类,我非常喜欢它,这让我很懊恼,在这样做时,字体似乎从来没有使用过: font.size := AFontsize; font.style := AFontStyle; font.color := AFontColor; 但当我这样做时,情况确实发生了变化: Canvas.Font.Assign(Font); 在Delphi7中我不必这样做,但我似乎必须在2009年这样做。怎么回事 如果在面板中使用画布绘制文本,则必须设置画布字体 某些组件和/或某些Delphi版本可

我有一个TPanel的子类,我非常喜欢它,这让我很懊恼,在这样做时,字体似乎从来没有使用过:

font.size := AFontsize;
font.style := AFontStyle;
font.color := AFontColor;
但当我这样做时,情况确实发生了变化:

Canvas.Font.Assign(Font);

在Delphi7中我不必这样做,但我似乎必须在2009年这样做。怎么回事

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

某些组件和/或某些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;

也许
ParentFont:=true
?,首先设置ParentFont:=false,然后重试。@Johan,更改字体会自动将ParentFont设置为false(在OI中尝试)。Is
Canvas.font:=font真的是推荐的方法吗?是不是应该是
Canvas.Font.Assign(Font)
?谢谢,我想我已经试过了,设置
Canvas.Font.Assign(Font)
导致我正在画的东西被重画(因此,很多闪烁),我肯定是无意中用了另一种方式。@AndriyM:VCL通常使用
Canvas.Font:=Font
。因此,这与使用
Assign
相同,因为
Font
属性本身的设置过程执行
Assign