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

ご覧のとおり、このコードは非常に優れており、完璧に動作することが気に入っています。これで、クライアントがフォントを必要とせずにフォームにフォントを含めることができるようになりました。

小さな問題が 1 つあります。これを使用してビジュアル スタジオレポートのテキスト ボックス フォントを設定するにはどうすればよいでしょうか???? レポートのコードがないので、途方に暮れています!

まあ、どこかで誰かが何かを知っていることを願っています。私が考えることができる唯一のことは、式やおそらくパラメータを使用することです。

どうもありがとう!

4

1 に答える 1

1

これを機能させるには、いくつかのオッズがあります。コードにより、GDI でレンダリングするすべてのコードと、GDI+ でレンダリングするすべてのコードの両方でフォントを使用できるようになります。ReportViewer がレポートをレンダリングするために使用する可能性が高いのは GDI であるため、これはかなり古いコードの塊です。唯一の実際の要件は、レポートを表示する前にこのコードが実行されることを確認することです。

ただし、信頼できないのは、明らかな理由から、コードによって返される Font です。これを修正するには、レポート内のフォントをファミリ名で参照する必要があります。これを機能させるは、実際に開発マシンにフォントをインストールして、レポート デザイナーでフォントを選択できるようにする必要があります。ユーザーのマシンでは、そのフォント名はメモリ フォントから選択されたフォントを取得するのに十分なはずです。

保証はありませんが、まともなオッズです。

AddMemoryFont() を呼び出した後にフォントのメモリを解放することが正しくないため、レポートに問題がある可能性もあります。アプリがフォントを使用できる限り、割り当てたままにしておく必要があります。障害モードは、気付かれない可能性が非常に高いため、非常に不安定です。背景の回答はこちらです。一言で言えば、FreeCoTaskMem() を呼び出さないでください。Windows がクリーンアップされます。

于 2013-01-06T22:48:31.750 に答える