如何使用我当前的windows.forms应用程序中的自定义.tff字体文件? 我读了一些我用它作为嵌入式资源的地方,但是如何将它设置为System.Drawing.Font类型?
答案 0 :(得分:13)
这篇文章:How to embed a true type font展示了如何在.NET中执行您的要求。
如何嵌入True Type字体
某些应用程序,出于美观或所需视觉的原因 风格,将嵌入某些不常见的字体,以便它们始终存在 在需要时,无论字体是否实际安装在上面 目的地系统。
这个秘诀是双重的。首先需要放入字体 将资源添加到解决方案并将其标记为的资源 嵌入式资源。其次,在运行时,通过a加载字体 流并存储在PrivateFontCollection对象中供以后使用。
此示例使用的字体不太可能安装在您的 系统。 Alpha Dance是一款免费的True Type字体,可从中获得 免费字体集。此字体已嵌入到应用程序中 将其添加到解决方案并选择“嵌入式资源” 在属性中构建动作。
文件成功包含在您需要的资源中后 提供一个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显示了正在运行的应用程序。
请参阅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。