How to embed a True Type font(转载)

Some applications, for reasons of esthetics or a required visual style, will embed certain uncommon fonts so that they are always there when needed regardless of whether the font is actually installed on the destination system.

The secret to this is twofold. First the font needs to be placed in the resources by adding it to the solution and marking it as an embedded resource. Secondly, at runtime, the font is loaded via a stream and stored in a PrivateFontCollection object for later use.

This example uses a font which is unlikely to be installed on your system. Alpha Dance is a free True Type font that is available from the Free Fonts Collection. This font was embedded into the application by adding it to the solution and selecting the "embedded resource" build action in the properties.

Figure 1. The Alpha Dance font file embedded in the solution.

Once the file has been successfully included in the resources you need to provide a PrivateFontCollection object in which to store it and a method by which it's loaded into the collection. The best place to do this is probably the form load override or event handler. The following listing shows the process. Note how the AddMemoryFont method is used. It requires a pointer to the memory in which the font is saved as an array of bytes. In C# we can use the unsafe keyword for convienience but VB must use the capabilities of the Marshal classes unmanaged memory handling. The latter option is of course open to C# programmers who just don't like the unsafe keyword.

    PrivateFontCollection pfc = new PrivateFontCollection();

 

    private void Form1_Load(object sender, System.EventArgs e)

    {

      Stream fontStream = this.GetType().Assembly.GetManifestResourceStream("embedfont.Alphd___.ttf");

 

      byte[] fontdata = new byte[fontStream.Length];

      fontStream.Read(fontdata,0,(int)fontStream.Length);

      fontStream.Close();

      unsafe

      {

        fixed(byte * pFontData = fontdata)

        {

          pfc.AddMemoryFont((System.IntPtr)pFontData,fontdata.Length);

        }

      }

    }

 

Fonts may have only certain styles which are available and unfortunately, selecting a font style that doesn't exist will throw an exception. To overcome this the font can be interrogated to see which styles are available and only those provided by the font can be used. The following listing demonstrates how the Alpha Dance font is used by checking the available font styles and showing all those that exist. Note that the underline and strikethrough styles are pseudo styles constructed by the font rendering engine and are not actually provided in glyph form.

    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

    {

      bool bold=false;

      bool regular=false;

      bool italic=false;

 

      e.Graphics.PageUnit=GraphicsUnit.Point;

      SolidBrush b = new SolidBrush(Color.Black);

 

      float y=5;

 

      System.Drawing.Font fn;

 

      foreach(FontFamily ff in pfc.Families)

      {

        if(ff.IsStyleAvailable(FontStyle.Regular))

        {

          regular=true;

          fn=new Font(ff,18,FontStyle.Regular);

          e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic);

          fn.Dispose();

          y+=20;

        }

        if(ff.IsStyleAvailable(FontStyle.Bold))

        {

          bold=true;

          fn=new Font(ff,18,FontStyle.Bold);

          e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic);

          fn.Dispose();

          y+=20;

        }

        if(ff.IsStyleAvailable(FontStyle.Italic))

        {

          italic=true;

          fn=new Font(ff,18,FontStyle.Italic);

          e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic);

          fn.Dispose();

          y+=20;

        }

        if(bold  && italic)

        {

          fn=new Font(ff,18,FontStyle.Bold | FontStyle.Italic);

          e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic);

          fn.Dispose();

          y+=20;

        }

        fn=new Font(ff,18,FontStyle.Underline);

        e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic);

        fn.Dispose();

        y+=20;

        fn=new Font(ff,18,FontStyle.Strikeout);

        e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic);

        fn.Dispose();

      }

 

      b.Dispose();

    }

 

Figure 2 shows the application in action.

Figure 2. The embedded Alpha Dance font.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值