2011-06-10 63 views
7

幾乎在每個論壇中都會問這個問題,包括here,但是我找不到任何可接受的答案。我開始認爲實際上沒有解決方案,我只需將我的代碼封裝在try/catch塊中,並向用戶道歉並要求他們選擇另一種字體。C#將FontDialog設置爲僅顯示TrueType字體

我想顯示一個FontDialog,以便用戶可以更改Chart上的字體,但是如果用戶選擇非TrueType字體,則會拋出異常。 GDI +只能處理TrueType字體。

如何從FontDialog中過濾不能與GDI +一起使用的字體?

+0

實現您自己的Font選擇器有多難。對於最重要的選項可能需要幾個小時,但不應花費幾個星期。 – CodingBarfield 2011-06-10 07:09:26

+0

@David這真的取決於他在用什麼。 – CodingBarfield 2011-06-10 12:37:59

回答

4

FontDialog類已經這樣做了,它使用帶有CF_TTONLY選項的ChooseFont()API調用。這會強制對話框僅顯示將自己宣傳爲TrueType字體的字體。這些鏈接暗示着周圍的字體愚弄了對話,直到今天才從未聽說過。這使得它非常罕見,但肯定不會出乎意料,有很多垃圾字體與壞的元數據。

沒有任何東西可以用來捕獲異常,它是在.NET框架中的回調函數中引發的。重寫課程是一種選擇,但不是一個愉快的選擇。卸載troublemaker字體當然是一個簡單的解決方案。

+2

感謝Hans。我正在運行Win7 x64,僅安裝Adobe Photoshop和Mathematica字體;其餘的都是股票字體。大約一半的字體導致了這種例外,所以不幸的是,卸載麻煩的字體不是一種選擇。 – Ozzah 2011-06-13 23:27:14

1

圍繞這一除了嘗試沒有真正的好方法/ catch塊就

try 
{ 
    if (m_FontDialog.ShowDialog(frmMain.mainForm) == DialogResult.OK) 
    { 
     //Successful 
    } 
} 
catch (Exception ex) 
{ 
    //Not a truetype font 
    MessageBox.Show(frmMain.mainForm, ex.Message + Environment.NewLine + "Font not changed.", "Font Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
} 
+0

除了這不是一個可捕獲的異常! – Ozzah 2011-07-22 06:33:18

+0

@Ozzah:你的意思是「不可捕捉的例外」?捕捉工作正常。這是否意味着你不應該抓住它? – Binus 2011-10-24 12:08:03

+0

@Binus異常不能被捕獲:就像StackOverflowException。如果你把代碼放在try/catch中,什麼都不會發生 - 異常仍然發生,程序仍然崩潰。 – Ozzah 2011-10-24 21:49:13

0

您可以使用可用here定製FontDialog類克服這種例外。它是用C#.Net開發的。