После просмотра, возможно, 30-50 сообщений об этом, я, наконец, смог придумать решение, которое на самом деле работает! Следуйте инструкциям последовательно:
1.) Включите в свои ресурсы приложения файл шрифта (в моем случае, файл ttf). Для этого дважды щелкните файл «Resources.resx».
2.) Выделите опцию "Добавить ресурс" и нажмите на стрелку вниз. Выберите опцию «Добавить существующий файл». Теперь найдите файл шрифта, выберите его и нажмите «ОК». Сохраните файл «Resources.resx».
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!
** UseCompatibleTextRendering ** не нужен, если вы регистрируете шрифт с ** AddFontMemResourceEx() **. В качестве бонуса шрифт также можно использовать с TextBoxes и другими элементами управления. См. [Этот ответ] (http://stackoverflow.com/a/1956043/25312) и [документация MSDN] (https://msdn.microsoft.com/en-us/library/dd183325 (v = vs.85).) .aspx). – SWB
Можно ли добавить его в свойство элемента управления, чтобы выбрать один из встроенных шрифтов или обычный шрифт? Пример: 'private Font m_FontFace = UserControl.DefaultFont; public Font FontFace {get {return m_FontFace; } set {m_FontFace = значение; }} ' –
Незначительные рекомендации для использования в реальном мире, убедитесь, что FreeCoTaskMem находится в блоке finally, поэтому в случае исключений буфер памяти будет освобожден. – Rushyo