我在我的資源中嵌入了一個.ttf字體文件(「Amatic Bold」,具體而言),我使用下面的代碼獲取字體。 我試過代碼FOM這個帖子:How do I Embed a font with my C# application? (using Visual Studio 2005)C#中嵌入的資源字體無法正常工作
這是我實現:
static public Font GetCustomFont (byte[] fontData, float size, FontStyle style)
{
if (_fontCollection == null) _fontCollection = new PrivateFontCollection();
IntPtr fontPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(fontData.Length);
System.Runtime.InteropServices.Marshal.Copy(fontData, 0, fontPtr, fontData.Length);
_fontCollection.AddMemoryFont(fontPtr, fontData.Length);
System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontPtr);
return new Font(_fontCollection.Families[0], size, style);
}
進出口使用它這樣:
Font font = GetCustomFont(Properties.MainResources.Amatic_Bold, 25, System.Drawing.FontStyle.Bold);
問題是字體正在加載但使用時不能正確顯示;它看起來像是一個「Arial」或其他標準字體,而不是它應該是的。 如果我在Windows中安裝的字體,它的工作原理(我想是顯而易見的......)
我搜索了現有的答案,但could'nt找到我確切的問題...
任何幫助將不勝感激。 在此先感謝。
這個可怕的bug代碼就像病毒一樣,它非常難以擺脫。您正在被字體保存,它是一種OpenType字體。僅適用於WPF或Direct2D應用程序。字體映射器找到可以在Winforms應用程序中工作的替代品。 –
謝謝,@HansPassant。使用字體而不必安裝它有什麼好的選擇嗎? –
當您安裝字體時它實際上工作嗎?然後修復此代碼中的錯誤。您不能調用Marshal.FreeCoTaskMem(),直到不再使用字體並調用._fontCollection.Dispose()方法爲止_fontCollection.Families [0]總是返回第一個字體,而不是最後一個加載的字體。 –