以公制单位准确计算文本宽度

时间:2012-02-17 10:35:02

标签: delphi fonts gdi delphi-xe

我想以给定字符串的公制单位计算确切的文本宽度。我的伪代码看起来像这样:

Bitmap.Canvas.Assign(Font);
PixelWidth := Bitmap.Canvas.TextWidth(Font)
MetricWidth := PtToMM * (PixelWidth * 72.0 / GetScreenDPI);

PtToMM是一个定义为0.352777778的常量。对于某些字体和字体大小,这是非常准确的,但对于其他字体和字体大小,它太小或太大。我尝试了许多其他可能性,例如GetCharWidth32GetCharABCWidths,也使用了映射模式MM_LOMETRIC,但我无法让它工作。这个问题困扰着我,所以请任何人帮忙,告诉我哪里错了。非常感谢你!

编辑我检查了一个字符串:公制宽度计算为4.17厘米,实际打印输出的宽度(在纸上测量)为4.4厘米(字体Times New Roman,大小为12)。 / p>

1 个答案:

答案 0 :(得分:0)

我没有广泛地测试它,但它似乎给出了正确的结果。结果是文本的宽度以毫米为单位。此功能不支持自动换行和其他特殊注意事项。

另请注意,使用打印机时,不正确的“打印注册”可以“拉伸”文本。

另请注意,对于打印机,例如,将打印分辨率从300 ppp更改为1200 ppp也会更改结果。

uses
  ConvUtils, stdConvs ;

function CalcRequiredTextWidth(aDC : HDC; aFont : TFont; const asText: string): Double;
var vCanvas : TCanvas;
    iPixelsWidth : Integer;
    dInchWidth : Double;
    iFontSize : Integer;
begin
  vCanvas := TCanvas.Create;
  try
    vCanvas.Handle := aDC;

    vCanvas.Font.Assign(aFont);
    iFontSize := vCanvas.Font.Size;
    vCanvas.Font.PixelsPerInch := GetDeviceCaps(aDC, LOGPIXELSY);
    vCanvas.Font.Size := iFontSize;

    iPixelsWidth := vCanvas.TextExtent(asText).cx;

    dInchWidth := iPixelsWidth / GetDeviceCaps(vCanvas.Handle, LOGPIXELSX);

    Result := Convert(dInchWidth, duInches, duMicrons);

  finally
    vCanvas.Free;
  end;
end;