在C#windows.Form中使用的自定义.ttf字体

时间:2009-02-13 03:15:19

标签: c# winforms fonts

如何使用我当前的windows.forms应用程序中的自定义.tff字体文件? 我读了一些我用它作为嵌入式资源的地方,但是如何将它设置为System.Drawing.Font类型?

3 个答案:

答案 0 :(得分:13)

这篇文章:How to embed a true type font展示了如何在.NET中执行您的要求。

如何嵌入True Type字体

  

某些应用程序,出于美观或所需视觉的原因   风格,将嵌入某些不常见的字体,以便它们始终存在   在需要时,无论字体是否实际安装在上面   目的地系统。

     

这个秘诀是双重的。首先需要放入字体   将资源添加到解决方案并将其标记为的资源   嵌入式资源。其次,在运行时,通过a加载字体   流并存储在PrivateFontCollection对象中供以后使用。

     

此示例使用的字体不太可能安装在您的   系统。 Alpha Dance是一款免费的True Type字体,可从中获得   免费字体集。此字体已嵌入到应用程序中   将其添加到解决方案并选择“嵌入式资源”   在属性中构建动作。

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

  

文件成功包含在您需要的资源中后   提供一个PrivateFontCollection对象来存储它和一个   将其加载到集合中的方法。最好的去处   这可能是表单加载覆盖或事件处理程序。该   以下列表显示了该过程。注意AddMemoryFont方法如何   用来。它需要一个指向字体所在内存的指针   保存为字节数组。在C#中,我们可以使用unsafe关键字   方便,但VB必须使用Marshal类的功能   非托管内存处理。后一种选择当然对C#开放   程序员只是不喜欢unsafe关键字。   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);
    }
  }
}
  

字体可能只有某些可用的样式   不幸的是,选择一个不存在的字体样式会抛出一个   例外。为了克服这个问题,可以查询字体以查看哪个字体   样式可用,只能使用字体提供的样式。   下面的清单演示了如何使用Alpha Dance字体   检查可用的字体样式并显示所有存在的字体样式。   请注意,下划线和删除线样式是伪样式   由字体渲染引擎构造,实际上并未提供   以字形形式。

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

图2显示了正在运行的应用程序。

Figure 2. The embedded Alpha Dance font.

请参阅Form1_Paint事件处理程序,它具体说明了如何设置System.Drawing.Font类型。它基于使用System.Drawing.Text.PrivateFontCollection类。

希望这有帮助。

答案 1 :(得分:3)

通过p / invoke使用AddFontResourceEx API函数,传递FR_PRIVATE以防止安装全局字体。然后你应该像往常一样将字体名称传递给Font构造函数。

编辑:如果你使用PrivateFontCollection并从外部文件加载字体,你甚至不需要这个。如果从嵌入式资源加载字体,请使用Ash的解决方案。

答案 2 :(得分:3)

您可能会发现有用的MSDN文章How to: Create a Private Font Collection