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

时间:2010-08-23 05:22:07

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

我试图理解用户选择或指定的字体大小(例如,使用 FontDialog )与字体<报告的em-size之间的差异,这让我绞尽脑汁/ strong> .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”这样的小数尺寸?

2 个答案:

答案 0 :(得分:12)

考虑这些花絮:

  • 由于这些事情在历史上有所决定,因此包含72分。
  • 通常人们以逻辑分辨率(每英寸96点)运行Windows。
  • 嗯,好的,我们有点,英寸和点 - 这里有三个单位可以处理。
  • GDI想知道要绘制多少,并且用户正在选择 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等),这些数字将会改变。

答案 1 :(得分:1)

  

差异中没有模式

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

编辑:如果你不使用字体对话框,你可以微调大小,但我怀疑结果不如“首选”大小。