我在我的 Windows 窗体应用程序中嵌入了一种字体作为嵌入式资源,并希望在TextBox
.
的帮助AddMemoryFont()
说我必须设置兼容true
的文本渲染才能使用 GDI+,这样我的字体就可以使用了。但不知何故,它只是不会显示正确的字体。
在 Program.cs 我明确指出:
Application.SetCompatibleTextRenderingDefault(true);
那么为什么它不起作用呢?有人知道如何为 TextBox 设置自定义字体吗?
我在我的 Windows 窗体应用程序中嵌入了一种字体作为嵌入式资源,并希望在TextBox
.
的帮助AddMemoryFont()
说我必须设置兼容true
的文本渲染才能使用 GDI+,这样我的字体就可以使用了。但不知何故,它只是不会显示正确的字体。
在 Program.cs 我明确指出:
Application.SetCompatibleTextRenderingDefault(true);
那么为什么它不起作用呢?有人知道如何为 TextBox 设置自定义字体吗?
好的,感谢互联网和谷歌,我想通了。
以供将来参考,如果有人遇到此问题,解决方法是:在将嵌入字体作为流获取之后,在调用 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;