使用Canvas进行Delphi打印,将文本向右对齐

时间:2018-10-14 19:59:32

标签: delphi canvas printing

我正在使用TPrinter.Canvas进行打印,由于显示数字,我试图将文本向右对齐。

使用以下代码打印文本:

Printer.Canvas.Textout(800, 100, 250.00); //charge1
Printer.Canvas.Textout(800, 200,  10.00); //charge2
Printer.Canvas.Textout(800, 300, 260.00); //Total Amount

Sample image

如何对齐线条以正确显示?

2 个答案:

答案 0 :(得分:3)

应该使用Winapi DrawText,而不是使用VCL的TextOut,而是选择使用给定矩形内的Winapi DT_RIGHT来向右对齐,特别是使用DrawText(Canvas.Handle, PChar(T), Length(T), R, DT_SINGLELINE or DT_RIGHT); 。例如...

LowestUsedPrice

答案 1 :(得分:2)

您可以使用较低级别的设备上下文Api来更准确地控制文本输出,例如Jerry建议的DrawText()。但是,这样做需要您为文本输出预先计算/设置边界矩形,以便Windows知道任何对齐方式相对于的区域。

有两种可能更简单的选择:

选项1-仅适用于固定宽度的字体

这可能适合您,因为您似乎正在使用固定宽度的字体。

我们在这里所做的就是在输出之前在您的字符串中引入填充。这可能比输出矩形等所需的计算更简单。

要执行此操作,请确定要接受的最长字符串,然后在每个字符串的左侧添加所需的任何空格以确保它们的长度相同。使用固定宽度的字体,空格将与其他任何字符占用相同的水平空间,因此,通过使所有字符串具有相同的长度,您将实现“右对齐”:

procedure PrintRightJustified(const aX, aY, aMaxLen: Integer; aValue: String);
var
  s: String;
begin
  s := aValue;

  // Pad the string with spaces to the maximum length
  if Length(s) < aMaxLen then
    s := StringOfChar(' ', aMaxLen - Length(s)) + s;

  Printer.Canvas.Textout(aX, aY, s);
end;

然后调用此方法以将您右对齐的字符串输出为一致的最大长度,例如如果您的最大长度(999.99)为6:

PrintRightJustified(800, 100, 6, '250.00'); //charge1
PrintRightJustified(800, 200, 6, '10.00'); //charge2
PrintRightJustified(800, 300, 6, '260.00'); //Total Amount

作为练习,如何处理指定字符串长于最大宽度的情况。

选项2-对于任何字体

另一种对固定宽度或可变宽度字体(例如Arial)有效的方法是选择字符串最右边的位置,并根据为每个字符串计算的设备宽度来计算相对于此位置的X位置您正在输出:

procedure PrintRightJustified(const aRightX, aY; aValue: String);
var
  leftX: Integer;
begin
  leftX := aRightX - Printer.Canvas.TextWidth(aValue);

  Printer.Canvas.Textout(leftX, aY, aValue);
end;

您无需为此版本指定最大宽度,无论使用哪种字体,该宽度都可以使用:

PrintRightJustified(900, 100, '250.00'); //charge1
PrintRightJustified(900, 200, '10.00'); //charge2
PrintRightJustified(900, 300, '260.00'); //Total Amount

这确实意味着,如果没有某种机制来检测和处理此文本,文本可能会向左侧“流血”得太远。再次,如果这是一个问题,那么要么将右边缘进一步移开,要么您将不得不想出一种处理它的方法(由于我们不知道您的确切要求是什么,因此请您练习一下。) / p>