.NET GDI+ 中的字体大小差异?

2023-11-25

我正在绞尽脑汁地试图理解用户选择或指定的字体大小之间的差异(例如,使用字体对话框)和 em 大小报告Font.NET 中的类。

例如:

using (FontDialog dlg = new FontDialog()) {
    if (dlg.ShowDialog() == DialogResult.OK) {
        Console.WriteLine("Selected font size: " + dlg.Font.SizeInPoints.ToString("0.##"));
    }
}

使用上面的代码,你会得到一些令人困惑的结果:

在对话框中选择 11 会产生 11.25

在对话框中选择 12 将生成 12

在对话框中选择 14 会产生 14.25

在对话框中选择 16 会产生 15.75

无论您选择什么字体,都会发生此行为。从上面可以看出,差异没有任何模式,它似乎在 +0.25 和 -0.25 之间随机变化。

我在用户界面中通过仅将字体大小显示为四舍五入的整数来解决这个问题,但我发誓我见过允许用户选择小数字体大小的文字处理/DTP 包 - 并且这些包不显示上述行为与 Windows 字体对话框交互时。

谁能对此提供一个合理的解释?是否有在 UI 中显示字体大小的最佳实践技术?当用户想要小数尺寸(例如“10.5”)时该怎么办?


考虑这些花絮:

  • 由于这些事情是由历史决定的,一英寸包含72分。
  • 通常人们在以下位置运行 Windowslogical分辨率为每英寸 96 点。
  • 嗯,好的,我们有点、英寸和点——这里要处理的三个单位。
  • GDI 想知道有多少dots进行绘制,并且用户正在选择points.
  • 最后,每英寸 72 点 / 每英寸 96 点的比率 = 每点 0.75 点。

那个 0.75 太不幸了!这意味着,如果我们允许用户直接选择点,那么理想的渲染将仅绘制逻辑点的一部分。如果我们能够将整个渲染向上或向下对齐到最近的整个逻辑点,那就太好了。

准备好?开始了!


  • 11:
    • 11 点 / 每英寸 72 点 = 0.153 英寸 * 每英寸 96 点 = 14.667 点,BARF!
    • 让我们四舍五入到 15 个点,
    • 那么 15 点 / 每英寸 96 点 * 每英寸 72 点 = 11.25 点。

  • 12:
    • 12 / 72 * 96 = 16 点。
    • 我可以接受这一点,没有必要捏造。

  • 16:
    • 16 / 72 * 96 = 21.3333,BARF!
    • 让我们四舍五入为 21 点 / 96 * 72 = 15.75,这样更好。

你明白了。

请记住,如果用户更改其逻辑分辨率(96 dpi、120 dpi 等),这些数字也会发生变化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET GDI+ 中的字体大小差异? 的相关文章

随机推荐

  • 正确使用 LabelValueBean

    我有一个变量 private ArrayList
  • PHPStorm 和魔法方法

    我正在使用 PHPStorm 并编写了一个利用 SimpleXML 类的类 一切都很好 除了当我遍历 XML 字符串时 我会收到 未定义的属性 警告 xml simplexml load string string Returns Simp
  • 什么是参考插座?

    我最近刚刚将 Xcode 3 的副本升级到 Xcode 3 1 并且我注意到界面生成器中的一些新内容 引用插座 谁能解释一下引用出口是什么 以及它们与 mac 开发有何关系 这些是设置到相关对象的插座 例如 如果您选择一个作为窗口委托的对象
  • 如果与上次不同则发出的 RxJava 运算符

    如果要发射的项目不等于最后发射的项目 是否有一个运算符可以发射项目 有distinctUntilChanged RxJava还实现了distinctUntilChanged运算符 它仅将源 Observable 发出的项目与它们的直接前辈进
  • 有人可以向我解释 ASP.NET 信任级别吗?

    我听说过很多有关信任级别的内容 有人试图向我解释 但仍然无法给出一个场景 在该场景中我将应用一个信任级别而不是另一个信任级别 我已读完MSDN 的文章但这对我没有多大作用 有人可以提供一个真实世界的示例 说明您何时想要使用各种级别 完全 高
  • Java中Integer.MAX_VALUE的乘法[重复]

    这个问题在这里已经有答案了 我只是在玩Java 写了这个小程序 public class MaxValue public static void main String args int i Integer MAX VALUE for in
  • AngularJS 指令在模板中使用原始元素类型

    我正在为 Angular 开发基于 UI 和排版的指令 在这种情况下 指令所应用的元素是未知的 从 div span h1 到 h5 的任何元素 使用模板的原因是这样我可以添加ng 指令 因此开发人员除了指令名称之外不需要记住任何内容 我在
  • ASP.NET API 版本控制

    我是 ASP NET 新手 但我希望为即将开始的新 API 实现一些版本控制 我什至不确定我正在寻找的是否可能 但我正在寻找使用标头变量的非常干净的版本方法 理想情况下 我希望能够在代码结构中拥有一个版本文件夹 并在其中包含包含不同 API
  • Laravel 5.2 $errors 没有出现在 Blade 中

    因此 我正在学习 Laravel 5 基础教程 但我一直停留在表单验证上 我完全按照教程进行操作 但我收到一个未定义的变量 创建文章视图中的错误 在我遵循的教程和我在网上找到的内容中 他们说错误变量始终存在于刀片文件中供您使用 所以我不知道
  • ember.js 集合视图中特定于项目的操作

    我刚刚开始使用 ember js 库来了解它的全部内容 我想显示一个数据表 并在每行的右侧有一个删除按钮 用于从表中删除该项目 但我不知道该怎么做 请注意 我还尝试创建一个子视图 ItemView 并在 each each 部分中内联使用它
  • 在google colab中将python版本从3.7降级到3.6

    一些 python 包在 python 3 7 中无法工作 所以想降级google colab中的默认python版本 可以吗 如果是这样 该如何进行 请指导我 你可以安装 python 3 6miniconda bash MINICOND
  • Android:“启动画面”仅一次

    我有一个 Android 应用程序需要启动画面 我有一个简单的活动 它显示启动屏幕 几秒钟后 它启动 主要 活动 现在 当用户在该活动中按下后退按钮时 启动画面将再次显示 我怎样才能防止这种情况发生 我尝试保留一个布尔值 shownSpla
  • 如何在 MSSQL 中将 VARCHAR 转换为 TIMESTAMP?

    您希望在 T SQL 中调用 MS SQL 上具有 TIMESTAMP 参数类型的存储过程 而不是使用 VARCHAR 值 例如 0x0000000002C490C8 的 ADO NET 你做什么工作 更新 这是您收到 时间戳 值的地方 但
  • maven中的多次部署

    我们有一个内部工件存储库 目前所有快照都将部署在那里 我们还希望拥有一个具有 Web 界面的不同服务器 并希望将创建的工件复制到其中 对于我们的构建 我们使用 Hudson 但是构建后操作 将工件部署到 Maven 存储库 与 scp 一起
  • LATERAL JOIN 不使用三元组索引

    我想使用 Postgres 对地址进行一些基本的地理编码 我有一个地址表 其中包含大约 100 万个原始地址字符串 gt d addresses Table public addresses Column Type Modifiers ad
  • pandas 箱线图中共享轴的不同 ylim

    我有一个分组的 pandas 箱线图 排列在 2 2 网格中 import pandas as pd import numpy as np import matplotlib pyplot as plt df pd DataFrame np
  • 如何在批处理文件或 C# 中等待任务计划程序任务完成?

    我正在尝试编写一个执行两件事的批处理文件 首先 它启动一个安装程序 install exe 用于安装程序 program exe 其次 它启动已安装程序的实例 program exe 这必须在安装完成后执行 这相对简单 只是安装程序需要管理
  • 如何获取与 data.frame 或距离矩阵中给定值匹配的单元格的行号和列号?

    当我有一个距离矩阵 或基于矩阵的数据框 时 如何获取与给定值对应的行和列 Example df lt data frame x c 11 20 y c 12 21 dst lt dist df 输出 1 2 3 4 5 6 7 8 9 2
  • 当用户尝试在 iOS 中打开电子邮件附件时如何显示“打开方式...”

    我见过一些iOS应用程序有这个功能 当用户尝试打开电子邮件附件时 他们可以按住附件几秒钟 然后会出现一个弹出菜单 其中显示两个按钮 一个按钮显示 在 iBooks 中打开 例如 当用户单击它时 应用程序将运行并打开附件 我想知道如何注册我的
  • .NET GDI+ 中的字体大小差异?

    我正在绞尽脑汁地试图理解用户选择或指定的字体大小之间的差异 例如 使用字体对话框 和 em 大小报告Font NET 中的类 例如 using FontDialog dlg new FontDialog if dlg ShowDialog