2013-04-11 2 views
8

Я добавил пользовательский шрифт, используя ниже код:addFontFile из ресурсов

PrivateFontCollection pfc = new PrivateFontCollection(); 
pfc.AddFontFile("C:\\Path To\\YourFont.ttf"); 
label1.Font = new System.Drawing.Font(pfc.Families[0], 16, FontStyle.Regular); 

Я добавил файл шрифта в ресурсах. Как добавить с addFontFile из ресурсов?

ответ

4

Если вы включили шрифт в ресурсах

Попробуйте эту функцию

private void addfontfrommemory() 
{ 
Stream fontStream = this.GetType().Assembly.GetManifestResourceStream("yourfont.ttf"); 

     byte[] fontdata = new byte[fontStream.Length]; 
     fontStream.Read(fontdata,0,(int)fontStream.Length); 
     fontStream.Close(); 
     unsafe 
     { 
     fixed(byte * pFontData = fontdata) 
     { 
      pfc.AddMemoryFont((System.IntPtr)pFontData,fontdata.Length); 
     } 
     } 
    } 

Отредактировано

Как ресурс нагрузки от узла: (YourNamespace.file.ttf)

Stream fontStream = Assembly.GetExecutingAssembly() 
.GetManifestResourceStream("WindowsFormsApplication1.SBADR.TTF"); 

Мое решение:

enter image description here

+0

и как изменить шрифт метки после этого? – Ladessa

+1

Попробуйте это: label.Font = new Font (pfc.Families [0], 18, FontStyle.Regular); ' – KF2

+0

Я получаю null исключение в' Stream fontStream = this.GetType(). Assembly.GetManifestResourceStream ("BOOKOS ,TTF "); ', но я уже добавил файл шрифта в ресурсы. Свойство * build * для BOOKOS.TFF является встроенным ... это правильно? – Ladessa

9
private static void AddFontFromResource(PrivateFontCollection privateFontCollection, string fontResourceName) 
{ 
    var fontBytes = GetFontResourceBytes(typeof (App).Assembly, fontResourceName); 
    var fontData = Marshal.AllocCoTaskMem(fontBytes.Length); 
    Marshal.Copy(fontBytes, 0, fontData, fontBytes.Length); 
    privateFontCollection.AddMemoryFont(fontData, fontBytes.Length); 
    Marshal.FreeCoTaskMem(fontData); 
} 

private static byte[] GetFontResourceBytes(Assembly assembly, string fontResourceName) 
{ 
    var resourceStream = assembly.GetManifestResourceStream(fontResourceName); 
    if (resourceStream == null) 
     throw new Exception(string.Format("Unable to find font '{0}' in embedded resources.", fontResourceName)); 
    var fontBytes = new byte[resourceStream.Length]; 
    resourceStream.Read(fontBytes, 0, (int)resourceStream.Length); 
    resourceStream.Close(); 
    return fontBytes; 
} 
+1

Это для меня лучшее решение, позволяющее избежать использования «unsafe {}» с помощью класса System.Runtime.InteropServices.Marshal. Кроме того, я использовал «GetFontResourceBytes (System.Reflection.MethodBase.GetCurrentMethod(). DeclaringType.Assembly, fontResourceName)» для моего решения. – HidekiAI

+0

Я также предпочел это решение вместо того, чтобы изменить весь процесс сборки только для «небезопасного» вызова. Также для сборки я использовал 'GetFontResourceBytes (Assembly.GetExecutingAssembly(), fontResourceName);' –

3

Это так, как я это сделать.

Сначала получите файл Font.ttf и с помощью Visual Studio перетащите файл в корневую папку или папку ресурсов.

В обозревателе решений щелкните правой кнопкой мыши файл и щелкните свойства. Выберите Build Action = Content. Это покажет файл в файлах приложений в разделе «Свойства проекта»> «Опубликовать»> «Файлы приложений». Вы увидите, что теперь можно выбрать файл (по умолчанию он автоматически включается).

ClickOnce теперь будет копировать файл в StartupPath

Чтобы использовать его, выполните этот пример:

PrivateFontCollection pfc = new PrivateFontCollection(); 

pfc.AddFontFile(Path.Combine(Application.StartupPath, "font_name.ttf")); 

textBox1.Font = new Font(pfc.Families[0], 18, FontStyle.Regular); 
+0

Если ваш файл шрифта в корневой папке, я думаю, вы не можете связать его с Application.StartupPath, потому что вы получите путь с помощью "bin/debug ". Поэтому вы должны так использовать; string path = Application.StartupPath.Substring (0, Application.StartupPath.IndexOf ("bin")) + fontName.ttf; – Erdogan

0

Это загрузит шрифт в частной коллекции шрифтов, а также избегать каких-либо ссылок на объект и память которые вы можете увидеть, используя приведенные выше примеры.

По соображениям производительности мы хотели только загрузить шрифт один раз и сохранить ссылки на шрифт для нескольких операций рисования между вызовами. Хитрость заключается в том, чтобы гарантировать, что PrivateFontCollection не выходит за пределы области действия, если вы сохраняете ссылку на созданный объект Font.

Добавить некоторые статические (общий) переменные

Private Shared _sharedFont As Font 
Private Shared _sharedFontCollection As Text.PrivateFontCollection 
Private Shared _sharedFontSize As Integer 

Тогда объявляют эти функции

Private Function LoadSharedFont(ByVal fontName As String, ByVal size As Integer, ByVal style As FontStyle) As Font 
    'Check if font name or size has changed, then clear cache 
    If size <> _sharedFontSize Then _sharedFont = Nothing 

    If _sharedFont Is Nothing Then 

     'Make this shared so this variable doesnt go out of scope and is garbage collected 
     _sharedFontCollection = New Text.PrivateFontCollection() 
     _sharedFont = LoadFont(fontName, size, style) 
     _sharedFontSize = size 
    End If 

    Return _sharedFont 
End Function 

и

Private Function LoadFont(ByVal fontName As String, ByVal size As Integer, ByVal style As FontStyle) As Font 
    Dim executingAssembly As System.Reflection.Assembly = Reflection.Assembly.GetCallingAssembly() 
    Dim myNamespace As String = executingAssembly.GetName().Name.ToString() 

    Try 
     Using fontstream = executingAssembly.GetManifestResourceStream(myNamespace + "." + fontName) 
      Dim fontBytes(CInt(fontstream.Length)) As Byte 
      fontstream.Read(fontBytes, 0, CInt(fontstream.Length)) 

      Dim fontData As System.IntPtr = Marshal.AllocCoTaskMem(fontBytes.Length) 
      Marshal.Copy(fontBytes, 0, fontData, fontBytes.Length) 
      _sharedFontCollection.AddMemoryFont(fontData, fontBytes.Length) 
      Marshal.FreeCoTaskMem(fontData) 
     End Using 

     Return New Font(_sharedFontCollection.Families(0), size, style) 

    Catch ex As Exception 
     'An unexpected error has occurred so return a default Font just in case. 
     Return New Drawing.Font("Arial", size, FontStyle.Regular) 
    End Try 

End Function 

Использование следующим образом:

Dim font = LoadSharedFont("OpenSans-CondBold.ttf", 12, FontStyle.Bold)