DT_RIGHT 的 DrawTextEx 截断文本

DrawTextEx with DT_RIGHT truncates text

我正在使用 DrawTextEx 将字符串绘制到 TCanvas 中,但是,当我设置 DT_RIGHT 标志并且大多数字符为“1”并且字体不是固定宽度时,(即:“ 551111,111" "Arial" 字体)字符串的起始位置计算错误,似乎在最后一个字符处被截断(详见图片)。

代码片段下方:

var
  dtPar: TDrawTextParams;  
  C: TCanvas; 
  R: TRect;
  Align: Integer; 

  ...

    dtPar.cbSize := SizeOf(dtPar);
    dtPar.iTabLength := 0;
    dtPar.iLeftMargin := 0;
    dtPar.iRightMargin := 0;
    dtPar.uiLengthDrawn := 0;

    Align := DT_NOPREFIX or DT_EDITCONTROL or DT_EXPANDTABS or DT_RIGHT or DT_WORDBREAK;

    DrawTextEx(C.Handle, PChar(FTextToDisplay), -1, R, Align, @dtPar)

我试过几个 Windows 版本,我注意到在 Vista 或更高版本上会发生这种情况。它不会出现在 XP 上。

我正在使用 Delphi XE 3 构建。

你可以调用两次DrawTextEx
第一次用dwDTFormat = DT_CALCRECT获取lprcin-out参数中TRect结构体的值;第二次你可以像你已经做的那样调用它,但传递第一次调用获得的TRect
编辑
从第一次调用中获取宽度,然后在第二次调用 DrawTextEx

之前重新定位矩形

问题是您传递给 DrawTextEx 的矩形超出了 canvas 的右边缘。