c# – 可视化报表查看器上的嵌入字体
使用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,rgbyt.Length); uint cFonts; AddFontMemResourceEx(rgbyt,rgbyt.Length,IntPtr.Zero,out cFonts); IntPtr pbyt = Marshal.AllocCoTaskMem(rgbyt.Length); if (null != pbyt) { Marshal.Copy(rgbyt,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); } 正如你所看到的,这段代码非常好,我很喜欢它完美无缺.现在我的表单最终可以有字体,而我的客户不需要它们. 有一个小问题,我在世界上如何使用它来设置visual studio报告文本框字体????报告没有代码,所以我完全失去了! 好吧,我希望有人在某处知道某些东西,我唯一能想到的就是使用表达式和/或可能的参数. 非常感谢你们! 解决方法
你有一些可能使这项工作.您的代码使字体既可用于使用GDI呈现的任何代码,也可用于使用GDI呈现的任何代码.由于GDI可能是ReportViewer用于呈现报表的,因此它是一个非常古老的代码块.唯一真正的要求是确保在显示报告之前运行此代码.
然而,您不能依赖的一件事是由您的代码返回的字体,原因很明显.要解决此问题,您必须通过系列名称引用报告中的字体.为了实现这一目标,您必须在开发机器上实际安装该字体,以便在报表设计器中选择它.在用户的机器上,该字体名称应该足以从存储器字体中选择字体. 没有保证,只有不错的赔率. 确保你修复了这段代码中的错误,也可能是你遇到报告问题的原因,在调用AddMemoryFont()之后释放字体的内存不正确.只要应用程序可以使用该字体,您必须保持分配.失败模式是非常不稳定的,因为它具有不被注意的好几率,后台回答is here.简而言之:只是不要调用FreeCoTaskMem(). Windows将清理. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- iphone – UITableView中的选中标记
- [转自Oracle官方中文博客]sqlplus 登录时快时慢问题诊断
- SP2-0042:Unknow command 'load data' - rest o
- ORA-28000: the account is locked-的解决办法
- 正则表达式 – 替换字符串中最后出现的字符
- 《Cocos2d-x实战 C++卷》上线了-源码-样章-感谢大家的支持
- Flex中调用FileReference.download()方法的限制【已解决】
- 正则表达式 – 在50,000个HTML页面中查找电话号码
- SQLite数据库的VDBE虚拟机(翻译自sqlite.org)
- c – GCC功能填充值