我正在将字体作为嵌入式资源嵌入到我的Windows窗体应用程序中,并希望在TextBox
中使用它。
AddMemoryFont()
的帮助文档说我必须将兼容的文本呈现设置为true
才能使用GDI+,然后就可以使用我的字体。但是它似乎无法显示正确的字体。
在Program.cs中,我明确声明:
Application.SetCompatibleTextRenderingDefault(true);
那么为什么它不起作用?有人知道如何将自定义字体设置给文本框吗?
我正在将字体作为嵌入式资源嵌入到我的Windows窗体应用程序中,并希望在TextBox
中使用它。
AddMemoryFont()
的帮助文档说我必须将兼容的文本呈现设置为true
才能使用GDI+,然后就可以使用我的字体。但是它似乎无法显示正确的字体。
在Program.cs中,我明确声明:
Application.SetCompatibleTextRenderingDefault(true);
那么为什么它不起作用?有人知道如何将自定义字体设置给文本框吗?
好的,我通过互联网和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,它将无法工作。
谢谢,它正在运作。
如何在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;
Stream fontStream = new MemoryStream(Properties.Resources.Font);
- Ege AydınmFontCollection
来自哪里,它如何使用?最终,我希望在我的控件中有一个属性,可以像通常选择字体一样选择字体(除了它有两个新字体)。例如:private Font m_FontFace = UserControl.DefaultFont; public Font FontFace { get { return m_FontFace; } set { m_FontFace = value; } }
- Arvo Bowenbyte[]
,以便您可以在此答案中替换Byte[] fontData
变量。只需在WinForms应用程序中键入Resource.<FONTNAME>即可。现在,您只需要像此答案中一样注册byte []
字体数据即可。 - sɐunıɔןɐqɐp