将Delphi TLabel的字体更改为斜体-为什么?

| 下面显示了默认TLabel的简单演示,其字体设置为Arial Regular 16。 单击该按钮时的代码为:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Font.Style := Label1.Font.Style + [fsItalic];
end;
当您单击按钮时,最后一个字符被截断,即: 默认情况下,TLAbel.AutoSize为true,所以应该可以,对吧?这在XE和Delphi 7中是相同的。这是错误吗?     
已邀请:
最后,额外的空间可以快速解决此问题。     
是的,它看起来是如此(尽管是一个很小的错误)。可能的解决方法包括 使用Windows API函数
TextOut
(或
DrawText
)自己绘制文本,以及 使用
TStaticText
(而不是
TLabel
),它只是Windows静态控件的包装器(在文本模式下)。当然,Windows可以正确绘制文本。 使用
TextOut
procedure TForm4.FormPaint(Sender: TObject);
const
  S = \'This is a test\';
begin
  TextOut(Canvas.Handle,
    10,
    10,
    PChar(S),
    length(S));
end;
使用静态控件(
TStaticText
) 我想这在Microsoft Windows操作系统中不是问题,而仅在VCL 4控件中。 更新资料 我试过了
procedure TForm4.FormPaint(Sender: TObject);
const
  S = \'This is a test\';
var
  r: TRect;
begin
  r.Left := 10;
  r.Top := 10;
  r.Bottom := r.Top + DrawText(Canvas.Handle,
    PChar(S),
    length(S),
    r,
    DT_SINGLELINE or DT_LEFT or DT_CALCRECT);
  DrawText(Canvas.Handle,
    PChar(S),
    length(S),
    r,
    DT_SINGLELINE or DT_LEFT);
end;
结果是这样的: 因此,毕竟这是Microsoft Windows操作系统(或Arial字体)中的问题。 解决方法是添加“ 10”标志:
procedure TForm4.FormPaint(Sender: TObject);
const
  S = \'This is a test\';
var
  r: TRect;
begin
  r.Left := 10;
  r.Top := 10;
  r.Bottom := r.Top + DrawText(Canvas.Handle,
    PChar(S),
    length(S),
    r,
    DT_SINGLELINE or DT_LEFT or DT_CALCRECT);
  DrawText(Canvas.Handle,
    PChar(S),
    length(S),
    r,
    DT_SINGLELINE or DT_LEFT or DT_NOCLIP);
end;
更新2 轻量级的修复可能是
type
  TLabel = class(StdCtrls.TLabel)
  protected
    procedure DoDrawText(var Rect: TRect; Flags: Integer); override;
  end;

...

{ TLabel }

procedure TLabel.DoDrawText(var Rect: TRect; Flags: Integer);
begin
  inherited;
  if (Flags and DT_CALCRECT) <> 0 then
    Rect.Right := Rect.Right + 2;
end;
产生结果 (但是硬编码一个魔术值(2)看起来很讨厌...)     

要回复问题请先登录注册