jpf*_*ius 5 delphi fonts gdi delphi-xe
我想以给定字符串的公制单位计算确切的文本宽度.我的伪代码看起来像这样:
Bitmap.Canvas.Assign(Font);
PixelWidth := Bitmap.Canvas.TextWidth(Font)
MetricWidth := PtToMM * (PixelWidth * 72.0 / GetScreenDPI);
Run Code Online (Sandbox Code Playgroud)
PtToMM是一个定义为的常量0.352777778.对于某些字体和字体大小,这是非常准确的,但对于其他字体和字体大小,它太小或太大.我尝试了许多其他可能性,例如GetCharWidth32和GetCharABCWidths映射模式,MM_LOMETRIC但我无法让它工作.这个问题困扰着我,所以请任何人帮忙,告诉我哪里错了.非常感谢你!
编辑我检查了一个字符串:公制宽度计算为4.17厘米,实际打印输出的宽度(在纸上测量)是4.4厘米(字体Times New Roman,大小12).
我没有对其进行广泛的测试,但它似乎给出了正确的结果。结果是文本的宽度(以千分之一毫米为单位)。此函数不支持自动换行和其他特殊注意事项。
另请注意,使用打印机时,不正确的打印套准可能会“拉伸”文本。
另请注意,对于打印机,将打印分辨率从 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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1867 次 |
| 最近记录: |