当然,根据计算机上安装的字体,用户在运行这个示例时,可能会得到不同的结果。
对于这个示例,像往常一样,创建一个标准的C# Windows应用程序,命名为EnumFont Families,首先添加要使用的另一个命名空间,我们要使用InstalledFontCollection类,它在System. Drawing.Text命名空间中定义:
using System;
using System.Drawing;
using System.Drawing.Text;
然后在Form1类中添加如下常量:
private const int margin = 10;
margin是文本与文档边缘之间的左边距和上边距的大小—— 它防止文本显示在客户区域边缘的右边。
因此,该示例以快捷方式显示字体系列,代码比较粗糙,在许多情况下并不是以真正应用程序中的方式执行任务。例如,我们为文档的大小硬编码了一个猜测出来的值(200,1500),使用Visual Studio .NET属性窗口把AutoScrollMinSize属性设置为这个值。一般情况下必须查看要显示的文本,计算出文档的大小。下一节介绍这个过程。
下面是OnPaint()方法:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
int verticalCoordinate = margin;
Point topLeftCorner;
InstalledFontCollection insFont = new InstalledFontCollection();
FontFamily [] families = insFont.Families;
e.Graphics.TranslateTransform(AutoScrollPosition.X,
AutoScrollPosition.Y);
foreach (FontFamily family in families)
{
if (family.IsStyleAvailable(FontStyle.Regular))
{
Font f = new Font(family.Name, 12);
topLeftCorner = new Point(margin, verticalCoordinate);
verticalCoordinate += f.Height;
e.Graphics.DrawString (family.Name, f,
Brushes.Black,topLeftCorner);
f.Dispose();
}
}
}
在这段代码中,首先使用InstalledFontCollection 对象获得一个数组,其中包含所有可用的字体系列。对于每个系列,我们实例化大小为12点的一个Font。为Font使用了一个简单的构造函数—— 有许多构造函数可以指定更多的选项。我们使用的构造函数带有两个参数:系列名称和字体的大小:
Font f = new Font(family.Name, 12);
这个构造函数构造了一个一般风格的字体。但是为了安全起见,在使用该字体显示文本前,先检查一下这种风格是否可用于每个字体系列,这是利用方法 FontFamily.IsStyleAvailable() 实现的,这种检查是非常重要的,因为并不是所有的字体都可以使用所有的风格:
if (family.IsStyleAvailable(FontStyle.Regular))
FontFamily.IsStyleAvailable()带有一个参数,即FontStyle枚举。该枚举包含许多标记,它们可以用按位OR运算符来组合。可能的标记有Bold、Italic、Regular、Strikeout和Underline。
最后,使用Font类的一个属性Height,该属性返回显示该字体文本需要的高度,以便算出行间距:
Font f = new Font(family.Name, 12);
topLeftCorner = new Point(margin, verticalCoordinate);
verticalCoordinate += f.Height;
为了使事情简单化,OnPaint()暴露出一些不太好的编程问题。首先,没有检查哪些文档区域需要绘制—— 而是显示所有的内容。另外,如前所述,实例化Font是一个计算密集型的过程,所以应保存字体,而不是每次调用OnPaint()时都实例化新副本。这样设计出来的代码将需要花费相当长的时间来绘图。为了节省内存,帮助垃圾收集器,在完成操作后对每个Font实例调用Dispose()。如果不这样,在10或20次绘图操作后,就会存在许多存储不再需要的字体的内存。
浙公网安备 33010602011771号