我在我的应用中嵌入了一个字体作为EmbeddedResource,并希望在文本框中使用它。 AddMemoryFont帮助说我必须将兼容的文本渲染设置为true才能使用GDI +,这样我的字体就可以使用,但不知怎的,它只是不会显示正确的字体。
在Program.cs中的我明确说明: Application.SetCompatibleTextRenderingDefault(真);
那么为什么它不起作用? 有人知道吗?
答案 0 :(得分:21)
好的,我想通过互联网和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,它就无法工作。
答案 1 :(得分:0)
谢谢。 在C#Windows应用程序中嵌入字体
[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;