4

使用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);
    }

正如你所看到的,这段代码非常好,我很喜欢它完美地工作。现在我的表单终于可以在我的客户不需要它们的情况下拥有字体了。

有一个小问题,我到底如何使用它来设置 Visual Studio报告文本框字体????报告没有代码,所以我完全不知所措!

好吧,我希望某个地方的某个人知道一些事情,我能想到的唯一事情就是与使用表达式和/或可能的参数有关。

非常感谢你们!

4

1 回答 1

1

你有一些机会来完成这项工作。您的代码使该字体可用于任何使用 GDI 呈现的代码以及任何使用 GDI+ 呈现的代码。由于 GDI 可能是 ReportViewer 用来呈现报表的一个,它是一段相当古老的代码。唯一真正的要求是确保此代码在显示报告之前运行。

但是,出于显而易见的原因,您不能依赖的一件事是您的代码返回的字体。要解决此问题,您必须通过姓氏来引用报告中的字体。为了使它工作您必须在您的开发机器上实际安装字体,以便您可以在报表设计器中选择它。在用户的机器上,该字体名称应该足以从内存字体中选择字体。

没有保证,只有不错的赔率。

请确保您修复了此代码中的错误,这也可能是您在报告中遇到问题的原因,调用 AddMemoryFont() 后释放字体的内存是不正确的。只要应用程序可以使用该字体,您就必须保留它。故障模式非常不稳定,因为它很有可能不被注意到,背景答案就在这里。简而言之:只是不要调用 FreeCoTaskMem()。窗户会清理干净。

于 2013-01-06T22:48:31.750 回答