I'm embedding a font in my windows forms application as embedded resource, and want to use it in a TextBox
.
The help of AddMemoryFont()
says I have to set compatible text rendering to true
in order to use GDI+, and so my font can then be used. But somehow it just won't display the right font.
In Program.cs I explicitly state:
Application.SetCompatibleTextRenderingDefault(true);
So why is it not working? Anybody got a clue on how to set a custom font to a TextBox?
Okay, I figured it out thanks to the interwebs and Google.
For future reference, if anybody has this problem, the fix is : after getting your embedded font as a stream, and before calling AddMemoryFont, you have to call AddFontMemResourceEx ! (Not available in C# so you have to import it :
[DllImport("gdi32.dll")]
private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [In] ref uint pcFonts);
and then :
//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);
And presto, you'll be able to use the font. Without the AddFontMemResourceEx it wont work.
Thanks it's working. TO Embed Font in c# Windows Application
[DllImport("gdi32.dll")]
private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [In] ref uint pcFonts);
PrivateFontCollection pFC = new PrivateFontCollection();
try
{
string[] resource = { "newFont-Bold.ttf", "newFont-Regular.ttf" }; // specify embedded resource name
foreach (var item in resource)
{
// receive resource stream
Stream fontStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(item);
// create an unsafe memory block for the font data
System.IntPtr data = Marshal.AllocCoTaskMem((int)fontStream.Length);
// create a buffer to read in to
byte[] fontdata = new byte[fontStream.Length];
// read the font data 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);
///IMPORTANT line to register font in system
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 up the unsafe memory
Marshal.FreeCoTaskMem(data);
}
}
catch (Exception exp)
{
Log.Error(exp);
}
return pFC;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With