WinForm无法正常使用字体嵌入资源

时间:2017-02-16 05:02:15

标签: winforms

enter image description here

嵌入式资源字体在控件上无法正常工作。

但它可以被Graphics对象使用。

  1. 首先,添加带有嵌入资源的fontawesome-webfont.ttf字体文件。

  2. 然后,从汇编资源中获取字体。

  3. 接下来,将font属性指定给控件。

  4. 代码在这里:

    using System;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Drawing.Text;
    using System.IO;
    using System.Reflection;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace Sample
    {
        public partial class FormSample : Form
        {
            PrivateFontCollection pfc;
            Font font ;
    
            public FormSample()
            {
                InitializeComponent();
                pfc = LoadFontFromResource("Sample.assets.fontawesome-webfont.ttf");
                font = new Font(pfc.Families[0], 16, FontStyle.Regular);
                this.textBoxControl1.Text = "\uf028 fontawesome";
                this.label1.Text = "\uf028 fontawesome";
                this.label1.ForeColor = Color.Green;
                this.textBoxControl1.ForeColor = Color.Green;
                this.label1.Font = font;
                this.textBoxControl1.Font = font;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                this.label1.Font = font;
                this.textBoxControl1.Font = font;
    
                Graphics g = this.CreateGraphics();
    
                g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
                g.InterpolationMode = InterpolationMode.HighQualityBilinear;
                g.PixelOffsetMode = PixelOffsetMode.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
    
                g.DrawString("\uf028 fontawesome(GDI+)", font, new SolidBrush(Color.Green), new Point(this.label1.Location.X+10, 80));
                g.Dispose();
            }
    
            /// <summary>
            /// Loads the font from resource.
            /// </summary>
            /// <param name="name">The name.</param>
            /// <returns>PrivateFontCollection.</returns>
            public static PrivateFontCollection LoadFontFromResource(string name)
            {
                PrivateFontCollection pfc = new PrivateFontCollection();
    
                Assembly assembly = Assembly.GetExecutingAssembly();
    
                using (Stream stream = assembly.GetManifestResourceStream(name))
                {
                    if (stream == null) return null;
    
                    byte[] fontData = new byte[stream.Length];
                    stream.Read(fontData, 0, (int)stream.Length);
    
                    IntPtr ptr = Marshal.AllocHGlobal(fontData.Length);
                    Marshal.Copy(fontData, 0, ptr, fontData.Length);
    
                    pfc.AddMemoryFont(ptr, fontData.Length);
    
                    return pfc;
                }
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)