我想以给定字符串的公制单位计算确切的文本宽度。我的伪代码看起来像这样:
Bitmap.Canvas.Assign(Font);
PixelWidth := Bitmap.Canvas.TextWidth(Font)
MetricWidth := PtToMM * (PixelWidth * 72.0 / GetScreenDPI);
PtToMM
是一个定义为0.352777778
的常量。对于某些字体和字体大小,这是非常准确的,但对于其他字体和字体大小,它太小或太大。我尝试了许多其他可能性,例如GetCharWidth32
和GetCharABCWidths
,也使用了映射模式MM_LOMETRIC
,但我无法让它工作。这个问题困扰着我,所以请任何人帮忙,告诉我哪里错了。非常感谢你!
编辑我检查了一个字符串:公制宽度计算为4.17厘米,实际打印输出的宽度(在纸上测量)为4.4厘米(字体Times New Roman,大小为12)。 / p>
答案 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;