2009-08-19 5 views
9

У меня есть ярлык на моей Winform, и я хочу использовать собственный шрифт под названием XCalibur, чтобы он выглядел более shnazzy.Использование пользовательских шрифтов в ярлыке на Winforms

Если я использую пользовательский шрифт на этикетке, а затем создаю решение, а затем .ZIP файлы в \ bin \ Release, конечный пользователь увидит ярлыки с моим пользовательским приложением, которое я использовал независимо от того, установлен ли этот шрифт или не?

Если это не так, то как правильно использовать пользовательские шрифты на Labels.Text?

ответ

20

Встроить шрифт в качестве ресурса (или просто включить его в каталог Bin), а затем использовать PrivateFontCollection, чтобы загрузить шрифт (см функции AddFontFile и AddMemoryFont). Затем вы используете шрифт, как обычно, на машине.

Класс PrivateFontCollection позволяет приложения устанавливать частную версию существующего шрифта без требования заменить версию шрифта системы . Например, GDI + может создать личную версию шрифта Arial в в дополнение к шрифту Arial , который использует система. PrivateFontCollection также можно использовать для установки шрифтов, которых нет в операционной системы.

Source

21

После просмотра, возможно, 30-50 сообщений об этом, я, наконец, смог придумать решение, которое на самом деле работает! Следуйте инструкциям последовательно:

1.) Включите в свои ресурсы приложения файл шрифта (в моем случае, файл ttf). Для этого дважды щелкните файл «Resources.resx».

enter image description here

2.) Выделите опцию "Добавить ресурс" и нажмите на стрелку вниз. Выберите опцию «Добавить существующий файл». Теперь найдите файл шрифта, выберите его и нажмите «ОК». Сохраните файл «Resources.resx».

enter image description here

3.) Создайте функцию (скажем, InitCustomLabelFont()), и добавьте в него следующий код.

 //Create your private font collection object. 
     PrivateFontCollection pfc = new PrivateFontCollection(); 

     //Select your font from the resources. 
     //My font here is "Digireu.ttf" 
     int fontLength = Properties.Resources.Digireu.Length; 

     // create a buffer to read in to 
     byte[] fontdata = Properties.Resources.Digireu; 

     // create an unsafe memory block for the font data 
     System.IntPtr data = Marshal.AllocCoTaskMem(fontLength); 

     // copy the bytes to the unsafe memory block 
     Marshal.Copy(fontdata, 0, data, fontLength); 

     // pass the font to the font collection 
     pfc.AddMemoryFont(data, fontLength); 

Ваш пользовательский шрифт теперь добавлен в PrivateFontCollection.

4.) Затем назначьте шрифт своей метке и добавьте в нее текст по умолчанию.

 //After that we can create font and assign font to label 
     label1.Font = new Font(pfc.Families[0], label1.Font.Size); 
     label1.Text = "My new font"; 

5.) Перейдите на макет формы и выберите свою метку.Щелкните его правой кнопкой мыши и выберите «Свойства». Найдите свойство «UseCompatibleTextRendering» и установите его на «True».

6.) При необходимости вы можете освободить шрифт после того, как убедитесь, что его больше нельзя использовать повторно. Вызовите PrivateFontCollection.Dispose() method, затем вы также можете безопасно вызвать Marshal.FreeCoTaskMem (данные). Это довольно часто, чтобы не беспокоиться и оставить шрифт загружен на всю жизнь приложения.

7.) Запустите приложение. Теперь вы увидите, что пользовательский шрифт был установлен для данной метки.

Cheers!

+0

** UseCompatibleTextRendering ** не нужен, если вы регистрируете шрифт с ** AddFontMemResourceEx() **. В качестве бонуса шрифт также можно использовать с TextBoxes и другими элементами управления. См. [Этот ответ] (http://stackoverflow.com/a/1956043/25312) и [документация MSDN] (https://msdn.microsoft.com/en-us/library/dd183325 (v = vs.85).) .aspx). – SWB

+0

Можно ли добавить его в свойство элемента управления, чтобы выбрать один из встроенных шрифтов или обычный шрифт? Пример: 'private Font m_FontFace = UserControl.DefaultFont; public Font FontFace {get {return m_FontFace; } set {m_FontFace = значение; }} ' –

+0

Незначительные рекомендации для использования в реальном мире, убедитесь, что FreeCoTaskMem находится в блоке finally, поэтому в случае исключений буфер памяти будет освобожден. – Rushyo

2

Добавить шрифт, который хотите использовать.

enter image description here

`

PrivateFontCollection modernFont = new PrivateFontCollection(); 

    modernFont.AddFontFile("Font.otf"); 

    label.Font = new Font(modernFont.Families[0], 40);` 

Я сделал метод, а также.

void UseCustomFont(string name, int size, Label label) 
    { 

     PrivateFontCollection modernFont = new PrivateFontCollection(); 

     modernFont.AddFontFile(name); 

     label.Font = new Font(modernFont.Families[0], size); 


    } 

enter image description here

+1

Дает «System.Runtime.InteropServices.ExternalException: общая ошибка в GDI +» – Fusseldieb

Смежные вопросы