一、前言

程序最基本的元素,就是文本,也就是字体。如果程序未进行高DPI的适配,最直观的感受便是字体的模糊。所以本篇便来说一下高DPI适配中的字体问题。

高DPI的适配,简单来说便是便是根据不同的DPI对尺寸和位置进行调整,那么就需要一个锚点,所有的尺寸和位置的变化都以此锚点为基准进行调整。

相信看完的你,一定会有所收获!

本文地址:https://www.cnblogs.com/lesliexin/p/14801347.html


二、字体字号与尺寸

WinForm程序,默认是支持系统的自动缩放处理的,只是处理的缩放效果比较烂,唯一的优点是保证了字体的清晰。

而我们进行高DPI适配时,正是基于其“字体是清晰”这一点。

首先,先说结论:在不同的DPI下,字体的尺寸是不同的,但是字号是相同的。带来的效果就是在不同的DPI下,字体在视觉上是一样大的。

对比图1:(分辨率:1080P,DPI:96)

对比图2:(分辨率:4K,DPI:192)

通过以上两图,我们会发现,在不同的DPI下,字体的字号是不同的,但是字体的尺寸却不一样。

这里不妨扩展一下,在DPI=192中的字体尺寸,如果是在DPI=96下,需要多大字号的字体才能达到这样的尺寸呢?

我看下截图:(分辨率:1080P,DPI:96)

可以看到,当DPI=96时,字体字号=18时,我们获得的尺寸即为在DPI=192时字体字号为9时的尺寸。

这里可以使用“DPI变大了2倍,字号也要变2倍”这种直观的推理来解释,事实也确实如此,不过只限于一些标准字体。


三、字符串尺寸计算的两种方式

在计算字符串的尺寸时,有两种方式:一是使用TextRenderer.MeasureText去计算;二是使用Graphics.MeasureString去计算。

相同点:

1,两都计算出的结果都是“自适应DPI的”,也就是说在不同的DPI下,相同的字符串与字体计算出的尺寸是不一样的。

不同点:

1,TextRenderer.MeasureText计算出的结果是包含一些“空白”的,其计算出来的尺寸与Label控件当AutoSize=true时的尺寸是一致的。

2,Graphics.MeasureString计算出的结果会去掉这些“空白”,计算的尺寸是“刚好”能包含住字符串。

所以在高DPI适配时,我会使用TextRenderer.MeasureText来计算尺寸,并以此为锚点


四、高DPI适配锚点

高DPI的适配,简单来说便是便是根据不同的DPI对尺寸和位置进行调整,那么就需要一个锚点,所有的尺寸和位置的变化都以此锚点为基准进行调整。

而我们的锚点,便是字体尺寸

举些例子:

1,原生控件。系统会自动进行缩放,但是大都只会对控件的“高度”进行自动调整,而宽度却不会变化 。

2,固定宽度。在程序中,很难避免不用到绝对尺寸,如图片、列表等,那么就涉及到这个绝对尺寸在不同DPI下的变化。

3,控件高度。对于一些高度不会变化的控件,或者需要指定控件高度时,需要计算出此高度在不同DPI下的变化,比如说需要让按钮的高度能显示全按钮文本。

解决方法:

首先,我们需要知道在96DPI时,此宽度能显示多少个字符。

其次,则非96DPI时,使用前面的TextRenderer.MeasureText方法计算出这些个字符所占的宽度。

最后,计算出来的宽度即是此DPI下与96DPI下视觉效果一致的宽度。

同理,高度也一样。

这也就是我们进行高DPI适配的锚点。

-[END]-

(原创)高DPI适配经验系列:(三)字体与字号、缩放锚点的更多相关文章

  1. (原创)高DPI适配经验系列:(四)高DPI适配示例

    一.前言 光说不练假把式. 原理说再多,也不如一个例子直观明了.所以本篇文章就来通过一个例子演示一下高DPI适配的流程. 相信看完的你,一定会有所收获! 本文地址:https://www.cnblog ...

  2. (原创)高DPI适配经验系列:(一)缩放比例与DPI对应关系

    一.前言 当下,2K分辨率已成为主流标配,3K.4K也已经广泛应用. 在屏幕尺寸不变的情况下,高分辨率也就意味着高DPI,对于桌面程序而言,除了先天就支持高DPI的框架外(如UWP.Electron等 ...

  3. (原创)高DPI适配经验系列:(二)按DPI范围适配

    一.前言 一个软件,往往会用到位图资源,比如图标.图片.水晶按钮等. 在使用了位图资源后,就不能对任意DPI都进行适配,因为这样适配的代价太大了. 像Win10的缩放比例可以由100%-500%,如果 ...

  4. Windows高DPI系列控件(一) - 饼图

    目录 一.醉一醉 二.效果展示 三.高DPI适配 1.高DPI框架运作 2.适配高DPI 3.适配饼图 四.相关文章 原文链接:Windos高DPI系列控件(一) - 饼图 一.醉一醉 眨眼功夫,20 ...

  5. Windows高DPI系列控件(二) - 柱状图

    目录 一.QCP 二.效果展示 三.高DPI适配 1.自定义柱状图 2.新的柱状图 3.测试代码 四.相关文章 原文链接:Windows高DPI系列控件(二) - 柱状图 一.QCP QCP全称QCu ...

  6. Qt之高DPI显示器(一) - 解决方案整理

    目录 DPI发展 1.PPI 2.DPI 一.Win自适应系统 二.Qt机制 1.Windows系统DWM缩放 2. Qt适配高DPI 3.适配DPI结论 三.Qt适配 四.自己适配 1.窗口大小 2 ...

  7. 支持 Windows 10 最新 PerMonitorV2 特性的 WPF 多屏高 DPI 应用开发

    Windows 10 自 1703 开始引入第二代的多屏 DPI 机制(PerMonitor V2),而 WPF 框架可以支持此第二代的多屏 DPI 机制. 本文将介绍 WPF 框架利用第二代多屏 D ...

  8. Qt之高DPI显示器(二) - 自适配解决方案分析

    目录 一.回顾 二.框架说明 1.ICallDPIChanged 2.IDPIHelper 3.悬浮窗体管理器 三.方案分析 1.窗口大小 2.字体大小 3.间距 4.图标 四.相关文章 原文链接:Q ...

  9. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

随机推荐

  1. linux程序开机自动启动

    linux如果需要实现开机启动, 可以找到 $HOME/.config/autostart 目录(没有的话新建一个),在该文件夹下创建一个空文件,文件名自拟,后缀必须是desktop,如:dingda ...

  2. istio:在vs中实现ab测试和路径切割

    此篇内容 主要目的是总结vs中的match的有关规则和在istio中如何实现路径切割(当下版本1.8.2) 实验demo main.go package main import ( "git ...

  3. [状压DP]炮兵阵地

    炮 兵 阵 地 炮兵阵地 炮兵阵地 题目描述 司令部的将军们打算在 N ∗ M N*M N∗M的网格地图上部署他们的炮兵部队.一个 N ∗ M N*M N∗M的地图由 N N N行 M M M列组成, ...

  4. --系统编程-网络-tcp客户端服务器编程模型、socket、htons、inet_ntop等各API详解、使用telnet测试基本服务器功能

    PART1 基础知识 1. 字节序 网络字节序是大端字节序(低地址存放更高位的字节), 所以,对于字节序为小端的机器需要收发网络数据的场景,要对这些数据进行字节序转换. 字节序转换函数,常用的有四个: ...

  5. JVM经典垃圾收集器

      这个关系不是一成不变的,由于维护和兼容性测试的成本,在JDK 8时将Serial+CMS. ParNew+Serial Old这两个组合声明为废弃(JEP 173),并在JDK 9中完全取消了这些 ...

  6. Linux 基础命令 命令进阶

    Linux命令格式:命令 选项 参数 (大部分命令是这个格式) 注意: 1.命令区分大小写 2.短选项可以合并   长选项不能合并 如 : 短选项 -l  -h 可以合并为 -lh 长选项  不能合并 ...

  7. JDBC_10_使用Statement实现升序和降序

    使用Statement数据库操作对象实现升序和降序 Statement可以使用在需要SQL语句拼接的情况下,因为在这样的情况下如果使用PreparedStatement就会给需要拼接的某个SQL关键字 ...

  8. 概A第一章测试

    ·  问题 1√ 得 10 分,满分 10 分       A与B不能同时发生,表明A与B互不相容.               ·  问题 2× 得 10 分,满分 10 分       A与B互逆 ...

  9. 硬件篇-02-TX2刷机Jetpack4.3

    Jetson TX2收货将近一周了,期间趁摄像头还没到,预先给TX2配置了环境.由于学校要求写毕设日志,故干脆一起在知乎写了,顺带帮助想要给TX2配环境却苦于网络上关于TX2的教程很少的同学. 本期内 ...

  10. composer PSR规范

    什么是PSR PSR 是 PHP Standard Recommendations (PHP 推荐标准)的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准. PHP FI ...