How do I Embed a font with my C# application? (using Visual Studio 2005)

后端 未结 4 1228
刺人心
刺人心 2020-11-30 09:11

What is the best way to embed a truetype font within the application i\'m developing? Basically i want to make sure a particular font is available to my application when ins

4条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-30 09:25

    Here's Will's answer, translated to C# (untested):

    PrivateFontCollection pfc = new PrivateFontCollection();
    
    using (Stream fontStream = GetType().Assembly.GetManifestResourceStream("Alphd___.ttf"))
    {
        if (null == fontStream)
        {
            return;
        }
    
        int fontStreamLength = (int) fontStream.Length;
    
        IntPtr data = Marshal.AllocCoTaskMem(fontStreamLength);
    
        byte[] fontData = new byte[fontStreamLength];
        fontStream.Read(fontData, 0, fontStreamLength);
    
        Marshal.Copy(fontData, 0, data, fontStreamLength);
    
        pfc.AddMemoryFont(data, fontStreamLength);
    
        Marshal.FreeCoTaskMem(data);
    }
    

    along with their Paint() method:

    protected void Form1_Paint(object sender, PaintEventArgs e)
    {
        bool bold = false;
        bool italic = false;
    
        e.Graphics.PageUnit = GraphicsUnit.Point;
    
        using (SolidBrush b = new SolidBrush(Color.Black))
        {
            int y = 5;
    
            foreach (FontFamily fontFamily in pfc.Families)
            {
                if (fontFamily.IsStyleAvailable(FontStyle.Regular))
                {
                    using (Font font = new Font(fontFamily, 32, FontStyle.Regular))
                    {
                        e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                    }
                    y += 40;
                }
                if (fontFamily.IsStyleAvailable(FontStyle.Bold))
                {
                    bold = true;
                    using (Font font = new Font(fontFamily, 32, FontStyle.Bold))
                    {
                        e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                    }
                    y += 40;
                }
                if (fontFamily.IsStyleAvailable(FontStyle.Italic))
                {
                    italic = true;
                    using (Font font = new Font(fontFamily, 32, FontStyle.Italic))
                    {
                        e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                    }
                    y += 40;
                }
    
                if(bold && italic)
                {
                    using(Font font = new Font(fontFamily, 32, FontStyle.Bold | FontStyle.Italic))
                    {
                        e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                    }
                    y += 40;
                }
    
                using (Font font = new Font(fontFamily, 32, FontStyle.Underline))
                {
                    e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                    y += 40;
                }
    
                using (Font font = new Font(fontFamily, 32, FontStyle.Strikeout))
                {
                    e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                }
            }
        }
    }
    

提交回复
热议问题