2009-02-13 104 views

回答

11

这篇文章:How to embed a true type font显示如何做你在.NET中问。

如何嵌入True Type字体

某些应用程序,用于美学或所需的视觉 风格的原因,将嵌入某些罕见的字体,这样他们总是在需要的时候有 无论该字体实际上安装在目标系统的 上。

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

本例中使用的字体是不可能被你 系统上安装。 Alpha Dance是一款免费的True Type字体,可从 免费字体收藏中获得。通过将该字体添加到解决方案中并在属性中选择“嵌入资源”构建操作,该字体被嵌入到应用程序 中。

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

一旦该文件已被成功列入资源需要 提供在其中存储它PrivateFontCollection对象,并通过它装入收集 方法。 这是可能的形式加载覆盖或事件处理程序的最佳位置。下面的清单 显示过程。请注意如何使用AddMemoryFont方法 。它需要一个指向保存为字节数组的字体为 的存储器。在C#中,我们可以使用不安全关键字 convienience,但VB必须使用非托管内存处理的元帅类 的功能。后一种选择当然是开放给C# 程序员谁不喜欢不安全的关键字。 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类。

希望这会有所帮助。

+6

请编辑您的答案。链接已经死亡。 – Odys 2015-05-19 10:47:17

3

通过p使用AddFontResourceEx API函数/调用,传递FR_PRIVATE防止安装全局字体。然后,您应该可以照常将字体名称传递给Font构造函数。

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

+1

有没有一个例子在哪里?我可以真正理解MSDN链接。谢谢你的帮助。 – kthakore 2009-02-13 03:43:57