加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 可视化报表查看器上的嵌入字体

发布时间:2020-12-15 21:44:48 所属栏目:百科 来源:网络整理
导读:使用Visual Studio 2012 Ultimate C#.NET4.5 好吧,这个已经腐烂了我的大脑,我有一些代码,我稍微调整一下,将一个字体嵌入到我的应用程序中.到目前为止一切顺利,所以我的客户端机器不再需要字体了. 到目前为止,这是我的代码: //add font [DllImport("gdi32.dl
使用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将清理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读