вставлять ttf как встроенный ресурс: не может ссылаться на него - PullRequest
0 голосов
/ 29 марта 2010

Я только что добавил файл ttf в проект (c # 2008 express) как «файл» и опцию сборки для встроенного ресурса.

У меня проблемы при попытке установить этот шрифт следующим образом: (Я знаю, что следующая строка неверна ...)

this.label1.Font = AlarmWatch.Properties.Resources.Baby_Universe;

Ошибка 1 Не удается неявно преобразовать тип 'byte []' to 'System.Drawing.Font' C: \ Users \ hongo \ Documents \ Visual студия 2008 \ Проекты \ AlarmWatch \ AlarmWatch \ Form1.Designer.cs 57 32 AlarmWatch

Я знаю, что это байт [], потому что я установил опцию build как встроенный ресурс, но по сравнению с этой строкой это правильно:

this.label1.Font = new System.Drawing.Font("OCR A Extended",
                           24F, System.Drawing.FontStyle.Regular,
                           System.Drawing.GraphicsUnit.Point, ((byte)(0)));

Как настроить this.label1 для использования нового шрифта?

Ответы [ 4 ]

2 голосов
/ 29 марта 2010

В пространстве имен System.Drawing.Text есть метод AddMemoryFont, который загружает шрифт из памяти (он берет указатель на блок памяти, поэтому вам нужно будет выполнить некоторую небезопасную операцию, чтобы получить указатель на ваш байт массив - я нашел пример здесь ). Подробнее о методе на MSDN .

Существует также связанный вопрос StackOverflow , показывающий, как импортировать функцию Win API для прямой загрузки шрифта (в случае, если вышеуказанный метод .NET не работает).

РЕДАКТИРОВАТЬ Перевод ключевой части из Visual Basic может выглядеть следующим образом (хотя еще не проверял):

// This should be probably a field of some class
PrivateFontCollection pfc = new PrivateFontCollection();

// allocate memory and copy byte[] to the location
IntPtr data = Marshal.AllocCoTaskMem(yourByteArray.Length);
Marshal.Copy(yourFontArray, 0, data, yourFontArray.Length);

// pass the font to the font collection
pfc.AddMemoryFont(data, fontStream.Length)

// Free the unsafe memory
Marshal.FreeCoTaskMem(data)

Как только вы это сделаете, вы сможете ссылаться на шрифт, используя его обычное имя.

0 голосов
/ 23 февраля 2016

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

Как добавить ttf в ваш проект C # как и встроенный ресурс

0 голосов
/ 14 мая 2014
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;
}
0 голосов
/ 29 марта 2010

Я решил проблему, прочитав этот предыдущий ответ на C #: Использование встроенного шрифта в текстовом поле

спасибо Томасу за ссылку.

...