代码之家  ›  专栏  ›  技术社区  ›  Bradley Smith

.NET GDI+中的字体大小不一致?

  •  9
  • Bradley Smith  · 技术社区  · 15 年前

    为了理解用户选择或指定的字体大小之间的差异,我绞尽脑汁(例如,使用 字体对话框 )以及 字体 .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字体对话框交互时不显示上述行为。

    有人能对此给出合理的解释吗?是否有在用户界面中显示字体大小的最佳实践技术?当用户想要“10.5”这样的分数大小时如何?

    2 回复  |  直到 15 年前
        1
  •  1
  •   leppie    15 年前

    差异中没有图案

    如您所见,字体大小以0.75的增量出现。

    编辑:如果不使用字体对话框,您可以微调大小,但我怀疑结果会比“首选”大小更不令人满意。

        2
  •  13
  •   Nicholas Piasecki    15 年前

    考虑一下这些小道消息:

    • 一英寸,不管这些东西在历史上如何决定,包含72点。
    • 通常人们在 符合逻辑的 分辨率为每英寸96点。
    • 嗯,好的,我们有点、英寸和点——这里要处理三个单位。
    • GDI想知道有多少 绘制,用户正在选择 .
    • 最后,72点/英寸/96点/英寸的比率=0.75点/点。

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

    准备好了吗?我们走吧!


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

    • 12:
      • 12/72*96=16点。
      • 我可以忍受,不需要逃避。

    • 16:
      • 16/72*96=21.3333, 巴夫!
      • 我们四舍五入到21点/96*72=15.75,好多了。

    你明白了。

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