C #: использование встроенного шрифта в текстовом поле - PullRequest
8 голосов
/ 24 декабря 2009

Я встраиваю шрифт в свое приложение как EmbeddedResource и хочу использовать его в текстовом поле. Справка AddMemoryFont говорит, что я должен установить совместимый рендеринг текста на true, чтобы использовать GDI +, чтобы можно было использовать мой шрифт, но почему-то он просто не будет отображать правильный шрифт.

в Program.cs Я прямо заявляю: Application.SetCompatibleTextRenderingDefault (истина);

Так почему же это не работает? У кого-нибудь есть подсказка?

1 Ответ

21 голосов
/ 24 декабря 2009

Хорошо, я понял это благодаря сетям и Google.

Для дальнейшего использования, если у кого-то есть эта проблема, исправление: после получения встроенного шрифта в виде потока и перед вызовом AddMemoryFont, Вы должны вызвать AddFontMemResourceEx! (Недоступно в C #, поэтому вы должны импортировать его:

    [DllImport("gdi32.dll")]
    private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [In] ref uint pcFonts);

и затем:

            //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
        mFontCollection.AddMemoryFont(data, (int)fontStream.Length);
        //close the resource stream
        fontStream.Close();
        //free the unsafe memory
        Marshal.FreeCoTaskMem(data);

И до того, вы сможете использовать шрифт. Без AddFontMemResourceEx это не будет работать.

...