How to use resource font directly without saving font in local file system for standalone application[desktop application] in VB.net/C#?
+2
A:
Are you talking about Packaging fonts with application. if Yes. check out this: http://msdn.microsoft.com/en-us/library/ms753303.aspx
Harsha
2010-05-28 11:22:42
+2
A:
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);
}
}
}
The memory management is a tricky btw, the MSDN docs say nothing about how long the IntPtr should remain valid. I just assumed the font pointer needed to be valid for the life of the app.
Hans Passant
2010-05-28 13:36:23
Superb. Thanks for posting.
Harsha
2010-06-03 14:36:32