2008-10-22 62 views
13

我想知道是否有任何簡單的方法來獲取在C#中安裝在用戶系統上的所有固定寬度(等寬)字體的列表?我使用.net 3.5所以有權訪問WPF System.Windows.Media命名空間和LINQ來獲取字體信息,但我不知道我在找什麼。如何獲得所有安裝的固定寬度字體?

我希望能夠提供一個過濾的等寬字體列表和/或從更大的字體列表中選取等寬字體(如VS選項對話框中所示)。

回答

11

看一看:在有結構的

http://www.pinvoke.net/default.aspx/Structures/LOGFONT.html

使用一個,然後遍歷家庭,實例化一個字體,並獲得了LOGFONT值和檢查lfPitchAndFamily。

下面的代碼寫在飛的和未經考驗,但像下面應該工作:

foreach (FontFamily ff in System.Drawing.FontFamily.Families) 
{ 
    if (ff.IsStyleAvailable(FontStyle.Regular)) 
    { 
     Font font = new Font(ff, 10); 
     LOGFONT lf = new LOGFONT(); 
     font.ToLogFont(lf); 
     if (lf.lfPitchAndFamily^1) 
     { 
      do stuff here...... 
     } 
    } 
} 
+0

`lfPitchAndFamily`沒有按't work(always zero)and`(lf.lfPitchAndFamily^1)`給出一個錯誤('CS0029:不能隱式地將類型'int'轉換爲'bool') – Doc 2014-09-04 16:27:05

5

AFAIK你不能使用BCL庫。你必須使用WinAPI互操作。

您需要分析LOGFONT .lfPitchAndFamily成員的2個最低位。有一個常量FIXED_PITCH(意思是字體是固定寬度),可以用作lfPitchAndFamily的位掩碼。

這裏是一個有用的文章:

枚舉字體可以稍微 混亂,除非你想 枚舉系統上的所有字體, 可以是一個有點困難比MSDN暗示的 。本文將以 說明您需要的步驟,以便 用於查找您的系統上的每個固定寬度字體,並且還會列出每個 字體的每個可能的大小 。

6

不幸的是ToLogFont功能不填寫lfPitchAndFamily場來校正值。在我的情況下,它始終爲0。

一個近似檢測的字體可能會被固定在下面的

foreach (FontFamily ff in FontFamily.Families) { 
      if (ff.IsStyleAvailable(FontStyle.Regular)) { 
       float diff; 
       using (Font font = new Font(ff, 16)) { 
        diff = TextRenderer.MeasureText("WWW", font).Width - TextRenderer.MeasureText("...", font).Width; 
       } 
       if (Math.Abs(diff) < float.Epsilon * 2) { 
        Debug.WriteLine(ff.ToString()); 
       } 
      } 

     } 

請記住,他們是一些誤報,比如宋體

+0

0是一個「正確的」值。它的意思是`DEFAULT_PITCH`。 – 2013-04-19 04:15:37

相關問題