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;
我在使用 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;