2010-08-23 61 views
8

爲了理解用戶在.NET中選擇或指定的字體大小(例如,使用FontDialog)和Font類別報告的字體大小之間的差異,我正在絞盡腦汁。.NET GDI +中字​​體大小的不一致?

例如:

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'時怎麼樣?

回答

1

存在差異

正如你可以看到,字體大小在0.75增量發生無紋。

編輯:如果您不使用字體對話框,您可以微調尺寸,但我懷疑結果會比「首選」尺寸更不令人滿意。

+1

所以基本上,是改變整體尺寸在通用對話框(並一直)近似值?我是唯一一個覺得這有點莫名其妙的人嗎? :/ 向用戶提供分數字體大小顯然沒有意義,因爲在既定的約定中已經存在不精確的元素... – 2010-08-23 10:09:07

+0

@Bradley Smith:根據我的理解,是的。但是,如果您以不同的DPI設置運行顯示器,則可能會有所不同。我建議你一起玩,沒有得到答案,問問自己。 – leppie 2010-08-23 10:22:10

12

考慮一下這些花絮:

  • 一英寸,作爲然而,這些東西都在歷史決定的結果,包含了72分。
  • 通常人們在運行Windows的邏輯分辨率爲每英寸96點。
  • 嗯,好的,我們有點數,英寸和點數 - 這裏要處理三個單位。
  • GDI想知道有多少畫,並且用戶選擇
  • 最後,每英寸72點/每英寸96點=每點0.75點。

那0.75是不幸的!這意味着,如果我們允許用戶直接選擇點,那麼理想的渲染將僅使用邏輯點的一部分。如果我們可以將整個渲染對齊到最近的整個邏輯點,那將會很好。

準備好了嗎?開始了!


  • 11:
    • 11分每英寸/ 72分=0.153英寸*每英寸96點= 14.667點,BARF!
    • 讓我們圍繞15個點,
    • 然後15點/ 96點每英寸* 72點每英寸= 11.25點。

  • 12:
    • 72分之12* 96 = 16點。
    • 我可以忍受這一點,沒有必要的竄改。

  • 16:
    • 72分之16* 96 = 21.3333,BARF!
    • 讓我們下降到21點/ 96 * 72 = 15.75,好得多。

你的想法。

請記住,這些數字將如果用戶更改他們的邏輯分辨率(96 DPI,120 DPI等)