db211086004 Ответов: 1

Шрифт C# не изменится, но размер шрифта изменится в rich-textbox


I've downloaded several custom fonts. When the user presses a button I want the font of the text in a rich-textbox to change. But the fonts themselves don't change but the font size does. I also don't get any errors. When I install the font on my PC the font works perfectly. I can then also use it as the default font using the VS properties editor and can assign the font using both the codes below. But when I de-install the font it stops working again. It seems as if VS doesn't recognize the font even when using a direct directory link and just skips over/ignores the font part and just adjusts the size of the normal font. I have it working on labels but not on rich-textboxes.

Я просмотрел множество связанных с этим вопросов на этом форуме и в других местах, но ни один из них не сработал. Я хотел бы использовать пользовательские шрифты, которые пользователю не нужно устанавливать. Я также поместил шрифты в ресурсы с помощью Resources.resx и установил их в public.

Извините, если это глупый или легко решаемый вопрос, но я просто не могу заставить его работать с rich/textboxes.

Что я уже пробовал:

Это то, что я пробовал до сих пор:
PrivateFontCollection pfc = new PrivateFontCollection();
pfc.AddFontFile(@"C:\\Users\\MyName\\Documents\\Font\\6937\\HARRYP.ttf");
System.Drawing.Font font = new Font(pfc.Families[0], 12);
richTextBox_Translate.Font = font;


И любая перестановка этого:
richTextBox_Translate.Font = new Font(@"C:\\Users\\Myname\\Documents\\Font\\6937\\HARRY P", 12);
richTextBox_Translate.Font = new Font(@".\\Resources\\HARRY P", 12);
richTextBox_Translate.Font = new Font("HARRY P", 12);


Шрифт действительно меняется, когда я использую стандартный шрифт±
richTextBox_Translate.Font = new Font("Comic Sans MS", 12);


И я нашел (несколько) из них, но они тоже не работают:
[DllImport("gdi32.dll")]
private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [In] ref uint pcFonts);
PrivateFontCollection pFC = new PrivateFontCollection();

        private void LoadFont()
        {
            Stream fontStream = new MemoryStream(Properties.Resources.DBSScouter);
            //create an unsafe memory block for the data
            System.IntPtr data = Marshal.AllocCoTaskMem((int)fontStream.Length);
            //create a buffer to read in to
            Byte[] fontData = new Byte[fontStream.Length];
            //fetch the font program from the resource
            fontStream.Read(fontData, 0, (int)fontStream.Length);
            //copy the bytes to the unsafe memory block
            Marshal.Copy(fontData, 0, data, (int)fontStream.Length);

            // We HAVE to do this to register the font to the system (Weird .NET bug !)
            uint cFonts = 0;
            AddFontMemResourceEx(data, (uint)fontData.Length, IntPtr.Zero, ref cFonts);

            //pass the font to the font collection
            pFC.AddMemoryFont(data, (int)fontStream.Length);
            //close the resource stream
            fontStream.Close();
            //free the unsafe memory
            Marshal.FreeCoTaskMem(data);

            System.Drawing.Font font = new Font(pFC.Families[0], 12);
            richTextBox_Translate.Font = font;
        }

Richard MacCutchan

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

db211086004

Да и нет, потому что я пытаюсь использовать пользовательский шрифт с заданным путем, который не работает, но после установки шрифта на машину (что я не хочу делать) он действительно работает. Я только упомянул, что деинсталляция останавливает его работу снова, потому что я хотел дать как можно больше информации, чтобы было легче придумать ответ.

1 Ответов

Рейтинг:
0

RickZeeland

Вам, вероятно, нужно использовать Графика.Шнурок() метод, чтобы иметь возможность использовать эти шрифты, см. пример здесь: Как создать частную коллекцию шрифтов - Windows Forms | Microsoft Docs[^]
Также видеть: Расширенная типография | цвета, шрифты и текст[^]


db211086004

Нет делает то же самое. Редактор ясно показывает, что fontName становится правильным пользовательским шрифтом, но затем, когда создается новый шрифт для использования в DrawString, он устанавливает fontFamily в стандартный шрифт.