【问题标题】:Why do I need to assign the Canvas's font to change font size in Delphi 2009?为什么我需要分配 Canvas 的字体来更改 Delphi 2009 中的字体大小?
【发布时间】:2011-10-15 03:26:16
【问题描述】:

我有一个 TPanel 的子类,我非常非常非常喜欢它,让我懊恼的是,这样做时字体似乎永远不会占用:

font.size := AFontsize;
font.style := AFontStyle;
font.color := AFontColor;

但是当我这样做时它确实改变了:

Canvas.Font.Assign(Font);

在 Delphi 7 中我不必这样做,但在 2009 年我似乎必须这样做。有什么关系?

【问题讨论】:

  • 可能是ParentFont:= true?,先设置ParentFont:= false,然后再试一次。
  • @Johan,更改字体会自动将 parentfont 设置为 false(在 OI 中尝试)。

标签: delphi fonts delphi-2009


【解决方案1】:

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

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

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

这同样适用于Canvas.BrushCanvas.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;

【讨论】:

  • Canvas.Font := Font; 真的是推荐的方式吗?不应该是Canvas.Font.Assign(Font)吗?
  • 谢谢,我以为我已经尝试过了,设置Canvas.Font.assign(Font) 导致我正在绘制的东西重绘(因此,很多闪烁)我一定是无意中以相反的方式完成的。
  • @AndriyM:VCL 通常使用Canvas.Font := Font。因此它与使用Assign 相同,因为Font 属性的设置过程本身执行Assign
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
相关资源
最近更新 更多