使用 Visual Studio 2012 Ultimate C#.NET4.5
好吧,这个已经腐烂了我的大脑,我有一些代码我稍微调整了一下嵌入字体到我的应用程序上。到目前为止一切顺利,所以我的客户端机器不再需要字体了。
到目前为止,这是我的代码:
//add font
[DllImport("gdi32.dll", ExactSpelling = true)]
private static extern IntPtr AddFontMemResourceEx(byte[] pbFont, int cbFont, IntPtr pdv, out uint pcFonts);
/****/
//Dispose Font
[DllImport("gdi32.dll", ExactSpelling = true)]
internal static extern bool RemoveFontMemResourceEx(IntPtr fh);
/****/
static private IntPtr m_fh = IntPtr.Zero;
static private PrivateFontCollection m_pfc = null;
public Font GtSpecialFont(float size)
{
Font fnt = null;
if (null == m_pfc)
{
Stream stmFnt = Assembly.GetExecutingAssembly().GetManifestResourceStream("NewLabelPrinter.Resources.FREE3OF9.TTF"); // always returns null?
if (null != stmFnt)
{
byte[] rgbyt = new byte[stmFnt.Length];
stmFnt.Read(rgbyt, 0, rgbyt.Length);
uint cFonts;
AddFontMemResourceEx(rgbyt, rgbyt.Length, IntPtr.Zero, out cFonts);
IntPtr pbyt = Marshal.AllocCoTaskMem(rgbyt.Length);
if (null != pbyt)
{
Marshal.Copy(rgbyt, 0, pbyt, rgbyt.Length);
m_pfc = new PrivateFontCollection();
m_pfc.AddMemoryFont(pbyt, rgbyt.Length);
Marshal.FreeCoTaskMem(pbyt);
}
}
}
try
{
if (m_pfc.Families.Length > 0)
{
fnt = new Font(m_pfc.Families[0], size);
}
}
catch (Exception rdf)
{
MessageBox.Show("", rdf.ToString());
}
return fnt;
}
private void myFont()
{
txtBarCal.Font = GtSpecialFont(48.0f);
txtBarCodeOLD.Font = GtSpecialFont(48.0f);
txtBarCV.Font = GtSpecialFont(48.0f);
txtBarBK.Font = GtSpecialFont(48.0f);
txtNewBar.Font = GtSpecialFont(48.0f);
}
正如你所看到的,这段代码非常好,我很喜欢它完美无缺。现在我的表单最终可以使用字体而不需要我的客户端。
有一个小问题,我在世界上如何使用它来设置视觉工作室报告文本框字体 ????报告没有代码,所以我完全失去了!
好吧,我希望有人在某处知道某些事情,我唯一能想到的就是使用表达式和/或可能的参数。 非常感谢你们!答案 0 :(得分:1)
你有一些可能使这项工作。您的代码使字体既可用于使用GDI呈现的任何代码,也可用于使用GDI +呈现的任何代码。由于GDI可能是ReportViewer用于呈现报表的,因此它是一个非常古老的代码块。唯一真正的要求是确保在显示报告之前运行此代码。
你不能依赖的一件事是你的代码返回的字体,原因很明显。要解决此问题,您必须通过系列名称引用报告中的字体。要使 工作,您必须在您的开发计算机上实际安装该字体,以便您可以在报表设计器中选择它。在用户的机器上,该字体名称应该足以从存储器字体中选择字体。
没有保证,只有不错的赔率。
请确保修复此代码中的错误,也可能是您遇到报告问题的原因,在调用AddMemoryFont()之后释放字体内存不正确。只要应用程序可以使用该字体,您必须保持分配。失败模式非常不稳定,因为它具有不被注意的好几率,背景回答is here。简而言之:只是不要调用FreeCoTaskMem()。 Windows将清理。