• DELPHI GDI + TGPFont UnitPixel 问题解决


    查不少资料,在

     GPfont := TGPFont.Create(fontFamily,   Font.Size  , FontStyleRegular,UnitPixel  );

    时,显示的字体,并不是按DPI显示,特别是同时在屏幕与打印机显示时,差异更明显

    在切换 UnitPoint 能解决该问题,但是又遇到了新的问题,我想绘图后保存到文件,且需要高分辨率时,就over了

    重新查看微软官方API时,发现官方API与delphi中的一致,哪说明该问题,应该是有可解决的办法。

    先是试着

     GPfont := TGPFont.Create(fontFamily,   Font.Size/72*页面DPI  , FontStyleRegular,UnitPixel  ); 

    结果是行不通

    于是,我试着用

     GPfont := TGPFont.Create(fontFamily,   Font.Size*页面DPI  , FontStyleRegular,UnitPixel  );

    时,发现屏幕显示与打印,均保持一致,就是字特别大。

    到此,感觉终于找到方向,于是进一步随便除一个心理比值。

    于是,我试着用

     GPfont := TGPFont.Create(fontFamily,   Font.Size*页面DPI/3  , FontStyleRegular,UnitPixel  );

    显示的结果,意外的与使用UnitPoint 时相近 保存到高分辨率图片测试,效果满意,比值3是否最佳值,待进一步确认。


    function GETTextWidth(FontEx: TFontEx; str: string):Single 
    var GPG:TGPGraphics; fontFamily: TGPFontFamily; GPfont: TGPFont; boundingBox: TGPRectF; origin : TGPPointF; begin origin.x:=0; origin.Y:=0; GPG:=TGPGraphics.Create(Canvas.Handle);

    GPG.SetPageUnit(UnitPixel);
    
       fontFamily := TGPFontFamily.Create(Font.Name);
       GPfont := TGPFont.Create(fontFamily, Font.Size *DPI/3 ,Font.FontStyle,UnitPixel ); //UnitPixel  UnitPoint
    
      try
        GPG.MeasureString(str,-1,GPfont,origin,boundingBox);
        Result:=boundingBox.Width-length(str)*0.065* DPI/72;//取到的宽度均不够,适当减去一个值,不过还是不精确
      finally
       GPfont.Free;
       fontFamily.Free;
       GPG.Free;
      end;

    随手改了下工作中代码,上个取文字宽的完整代码供参考,没测试是否能运行。

    DPI 值由   GetDeviceCaps(PrinterHandle, LOGPIXELSX)等相关函数取得,不再列出

  • 相关阅读:
    Kafka入门经典教程【转】
    利用shell找出15分钟内修改的文件
    MySQL性能剖析工具(pt-query-digest)【转】
    Python3安装配置【转】
    查看nginx | apache | php | tengine | tomcat版本的信息以及如何隐藏版本信息【转】
    linux通过sendmail发送邮件
    crontab每10秒钟执行一次
    shell expect的简单用法【转】
    linux中Shell标准输出错误 >/dev/null 2>&1 分析【转】
    Ansible 插件 之 【CMDB】【转】
  • 原文地址:https://www.cnblogs.com/zhqian/p/11493579.html
Copyright © 2020-2023  润新知