Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use resource font directly in VB.net/C#

How to use resource font directly without saving font in local file system for standalone application[desktop application] in VB.net/C#?

like image 849
SamSol Avatar asked May 28 '10 11:05

SamSol


2 Answers

That's possible, you'll need to use the PrivateFontCollection.AddMemoryFont() method. For example, I added a font file named "test.ttf" as a resource and used it like this:

using System.Drawing.Text;
using System.Runtime.InteropServices;
...
public partial class Form1 : Form {
    private static PrivateFontCollection myFonts;
    private static IntPtr fontBuffer;

    public Form1() {
        InitializeComponent();
        if (myFonts == null) {
            myFonts = new PrivateFontCollection();
            byte[] font = Properties.Resources.test;
            fontBuffer = Marshal.AllocCoTaskMem(font.Length);
            Marshal.Copy(font, 0, fontBuffer, font.Length);
            myFonts.AddMemoryFont(fontBuffer, font.Length);
        }
    }

    protected override void OnPaint(PaintEventArgs e) {
        FontFamily fam = myFonts.Families[0];
        using (Font fnt = new Font(fam, 16)) {
            TextRenderer.DrawText(e.Graphics, "Private font", fnt, Point.Empty, Color.Black);
            //e.Graphics.DrawString("Private font", fnt, Brushes.Black, 0, 0);
        }
    }
}

Do note that the fontBuffer variable is static intentionally. Memory management is difficult when you use AddMemoryFont(), the memory needs to remain valid as long as the font can be used and the PrivateFontCollection is not yet disposed. Be sure not to call Marshal.FreeCoTaskMem() if you don't have that guarantee, it is a very common bug that causes very hard to diagnose text corruption. You only get an AccessViolationException when you are lucky. Keeping it valid for the life of the program is the simple solution.

like image 81
Hans Passant Avatar answered Nov 05 '22 22:11

Hans Passant


Are you talking about Packaging fonts with application. if Yes. check out this: http://msdn.microsoft.com/en-us/library/ms753303.aspx

like image 24
Harsha Avatar answered Nov 05 '22 23:11

Harsha