如何使用我当前的windows.forms应用程序中的自定义.tff字体文件?我读了一些我用它作为嵌入式资源的地方,但是如何设置System.Drawing.Font类型呢?
本文:如何嵌入真正的字体显示如何在.NET中执行您的要求.
如何嵌入True Type字体
由于美观或所需视觉样式的原因,某些应用程序将嵌入某些不常见的字体,以便在需要时始终存在,无论字体是否实际安装在目标系统上.
这个秘诀是双重的.首先,需要将字体添加到解决方案中并将其标记为嵌入资源,从而将字体放入资源中.其次,在运行时,字体通过流加载并存储在PrivateFontCollection对象中供以后使用.
此示例使用的字体不太可能安装在您的系统上.Alpha Dance是一款免费的True Type字体,可从Free Fonts Collection中获得.通过将此字体添加到解决方案并在属性中选择"嵌入资源"构建操作,将此字体嵌入到应用程序中.
一旦文件成功包含在资源中,您需要提供一个PrivateFontCollection对象来存储它,以及将它加载到集合中的方法.执行此操作的最佳位置可能是表单加载覆盖或事件处理程序.以下清单显示了该过程.请注意如何使用AddMemoryFont方法.它需要一个指向内存的指针,其中字体保存为字节数组.在C#中,我们可以使用unsafe关键字来获得方便性,但VB必须使用Marshal类非托管内存处理的功能.后一种选择当然对那些不喜欢unsafe关键字的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类.
希望这可以帮助.