我想知道是否有任何簡單的方法來獲取在C#中安裝在用戶系統上的所有固定寬度(等寬)字體的列表?我使用.net 3.5所以有權訪問WPF System.Windows.Media命名空間和LINQ來獲取字體信息,但我不知道我在找什麼。如何獲得所有安裝的固定寬度字體?
我希望能夠提供一個過濾的等寬字體列表和/或從更大的字體列表中選取等寬字體(如VS選項對話框中所示)。
我想知道是否有任何簡單的方法來獲取在C#中安裝在用戶系統上的所有固定寬度(等寬)字體的列表?我使用.net 3.5所以有權訪問WPF System.Windows.Media命名空間和LINQ來獲取字體信息,但我不知道我在找什麼。如何獲得所有安裝的固定寬度字體?
我希望能夠提供一個過濾的等寬字體列表和/或從更大的字體列表中選取等寬字體(如VS選項對話框中所示)。
看一看:在有結構的
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......
}
}
}
AFAIK你不能使用BCL庫。你必須使用WinAPI互操作。
您需要分析LOGFONT .lfPitchAndFamily成員的2個最低位。有一個常量FIXED_PITCH(意思是字體是固定寬度),可以用作lfPitchAndFamily的位掩碼。
這裏是一個有用的文章:
枚舉字體可以稍微 混亂,除非你想 枚舉系統上的所有字體, 可以是一個有點困難比MSDN暗示的 。本文將以 說明您需要的步驟,以便 用於查找您的系統上的每個固定寬度字體,並且還會列出每個 字體的每個可能的大小 。
不幸的是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是一個「正確的」值。它的意思是`DEFAULT_PITCH`。 – 2013-04-19 04:15:37
`lfPitchAndFamily`沒有按't work(always zero)and`(lf.lfPitchAndFamily^1)`給出一個錯誤('CS0029:不能隱式地將類型'int'轉換爲'bool') – Doc 2014-09-04 16:27:05