加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 以公制单位精确计算文本宽度

发布时间:2020-12-15 09:45:21 所属栏目:大数据 来源:网络整理
导读:我想以给定字符串的公制单位计算确切的文本宽度.我的伪代码看起来像这样: Bitmap.Canvas.Assign(Font);PixelWidth := Bitmap.Canvas.TextWidth(Font)MetricWidth := PtToMM * (PixelWidth * 72.0 / GetScreenDPI); PtToMM是一个常量,定义为0.352777778.对于
我想以给定字符串的公制单位计算确切的文本宽度.我的伪代码看起来像这样:

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).

解决方法

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

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

此外,请注意,对于打印机,例如,将打印分辨率从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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读