在C#窗口中使用的自定义.ttf字体。表单
如何使用自定义的.tff字体文件我有我当前的windows.forms应用程序? 我读了一些我将它用作嵌入式资源的地方,但是如何将它设置为System.Drawing.Font类型?在C#窗口中使用的自定义.ttf字体。表单
这篇文章:How to embed a true type font显示如何做你在.NET中问。
如何嵌入True Type字体
某些应用程序,用于美学或所需的视觉 风格的原因,将嵌入某些罕见的字体,这样他们总是在需要的时候有 无论该字体实际上安装在目标系统的 上。
这个秘密是双重的。首先,需要将字体添加到解决方案中,并将其标记为 嵌入式资源,以将资源置于 资源中。其次,在运行时,字体通过 流加载并存储在PrivateFontCollection对象*以后使用。
本例中使用的字体是不可能被你 系统上安装。 Alpha Dance是一款免费的True Type字体,可从 免费字体收藏中获得。通过将该字体添加到解决方案中并在属性中选择“嵌入资源”构建操作,该字体被嵌入到应用程序 中。
一旦该文件已被成功列入资源需要 提供在其中存储它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示出运行中的应用程序。
见Form1_Paint事件处理程序,它专门介绍如何设置System.Drawing.Font类型。它基于使用System.Drawing.Text.PrivateFontCollection类。
希望这会有所帮助。
请编辑您的答案。链接已经死亡。 – Odys 2015-05-19 10:47:17
通过p使用AddFontResourceEx API函数/调用,传递FR_PRIVATE防止安装全局字体。然后,您应该可以照常将字体名称传递给Font构造函数。
编辑:如果您使用PrivateFontCollection和从外部文件加载的字体,你甚至都不需要这个。如果您从嵌入式资源加载字体,请使用Ash的解决方案。
有没有一个例子在哪里?我可以真正理解MSDN链接。谢谢你的帮助。 – kthakore 2009-02-13 03:43:57
非常感谢您的帮助Thomas and Ash – kthakore 2009-02-13 04:15:08