【问题标题】:Font size discrepancy in .NET GDI+?.NET GDI+ 中的字体大小差异?
【发布时间】:2011-04-02 11:25:30
【问题描述】:

我绞尽脑汁试图理解用户选择或指定的字体大小(例如,使用 FontDialog)与 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'时怎么样?

【问题讨论】:

    标签: c# .net gdi+ font-size


    【解决方案1】:

    考虑这些花絮:

    • 一英寸,由于这些事情是由历史决定的,包含 72 点。
    • 通常人们以每英寸 96 点的逻辑分辨率运行 Windows。
    • 嗯,好的,我们有点、英寸和点——这里要处理三个单位。
    • GDI 想知道要绘制多少 ,而用户正在选择
    • 最后,每英寸 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 等),这些数字也会发生变化

    【讨论】:

      【解决方案2】:

      差异没有规律

      如您所见,字体大小以 0.75 为增量发生变化。

      编辑:如果您不使用字体对话框,您可以微调尺寸,但我怀疑结果会不如“首选”尺寸那么令人愉悦。

      【讨论】:

      • 所以本质上,常见对话框中的整数大小是(并​​且一直是)近似值?只有我觉得这有点莫名其妙吗? :/ 为我的用户提供分数字体大小显然没有意义,因为在既定的约定中已经存在不精确的元素......
      • @Bradley Smith:据我了解,是的。但这可能会有所不同,如果您以不同的 DPI 设置运行显示器。我建议你玩它,没有得到答案,问MS自己。
      猜你喜欢
      • 2023-03-29
      • 2015-03-17
      • 2012-07-14
      • 2015-02-16
      • 2010-12-03
      • 2016-03-17
      • 2013-01-02
      • 2017-06-14
      • 1970-01-01
      相关资源
      最近更新 更多