DrawTextEx 不适用于 DT_RIGHT 和 Arial 字体

DrawTextEx not working with DT_RIGHT and Arial font

我在使用 DrawTextEx 时遇到问题。使用 Align = DT_RIGHT 和字体“Arial”时,文本超出矩形。

这是我用来重现问题的代码:

procedure TForm2.FormShow(Sender: TObject);
var
  LRect: TRect;
  LString : string;
  LMetaCanvas: TMetafileCanvas;
  LAlign: integer;
  LParams: TDrawTextParams;
begin
  LMetaCanvas := TMetafileCanvas.Create(Image1.Picture.Metafile, 0);

  LRect := Rect(10, 10, 200, 200);

  LMetaCanvas.Brush.Color := clWhite;
  LMetaCanvas.Brush.style := bsSolid;

  LMetaCanvas.Rectangle(LRect.Left, LRect.Top, LRect.Right, LRect.Bottom);

  LMetaCanvas.Font.Name := 'Arial';
  LMetaCanvas.Font.Size := 10;
  LMetaCanvas.Brush.Color := clBlack;
  LMetaCanvas.Brush.Style := bsClear;
  LString := '111111111111111112';

  LParams.cbSize := SizeOf(LParams);
  LParams.iTabLength := 0;
  LParams.iLeftMargin := 0;
  LParams.iRightMargin := 0;
  LParams.uiLengthDrawn := Length(LString);

  LAlign := DT_RIGHT or DT_NOPREFIX or DT_EDITCONTROL or DT_EXPANDTABS or DT_NOCLIP;

  DrawTextEx(
    LMetaCanvas.Handle,
    PChar(LString),
    Length(LString),
    LRect,
    LAlign,
    @LParams);

  LMetaCanvas.Free;
end;

没有DT_NOCLIP,矩形外的字符都不会显示。

我在 Windows 10 Pro 上使用 Delphi 10.2,但我在 Delphi XE3 和 Delphi 2007 上也遇到过这个问题。

编辑:我尝试使用 DT_CALCRECT,但我不确定这是正确的方法……这是我使用的代码:

  LAlign := DT_RIGHT or DT_NOPREFIX or DT_EDITCONTROL or DT_EXPANDTABS or DT_NOCLIP or DT_CALCRECT;

  DrawTextEx(
    LMetaCanvas.Handle,
    PChar(LString),
    Length(LString),
    LRect,
    LAlign,
    @LParams);

  LAlign := DT_RIGHT or DT_NOPREFIX or DT_EDITCONTROL or DT_EXPANDTABS or DT_NOCLIP;

  DrawTextEx(
    LMetaCanvas.Handle,
    PChar(LString),
    Length(LString),
    LRect,
    LAlign,
    @LParams);

  LMetaCanvas.Free;
end;

第一次调用DrawTextEx后,LRect变为(10, 10, 120, 26),比我一开始配置的(10, 10, 200, 200)小。文本绘制时向左对齐(我想那是因为 LRect 已更改以适合文本)并且仍然没有 DT_NOCLIP 我看不到最后的数字。

编辑:出现此问题的项目需要 TMetaFileCanvas(用于其他目的)并使用 DrawTextEx 显示金额(必须右对齐),所以不幸的是我可以' 更改 canvas 类型、对齐方式或文本。使用不同的字体,如 Arial Unicode MS(似乎没有问题)将意味着更改大量现有报告,所以我宁愿避免这种解决方案..

正如@SertacAkyuz 所建议的,在 LString 末尾添加零宽度 space 解决了问题。

LString := LString + #0B;