字体(续)

启用制表位应使用StringFormat对象的SetTabStops方法,之后就可以在要绘制的文本中使用制表位了,方法是在文本字符串中包含制表符,然后把文本字符串和StringFormat对象传送给Graphics.DrawString方法。

Graphics g = e.Graphics;             g.FillRectangle(Brushes.White, this.ClientRectangle);             Font f = new Font("Times New Roman", 12);             Font bf = new Font(f, FontStyle.Bold);             StringFormat sf = new StringFormat();             float[] ts = { 10.0f, 70.0f, 100.0f, 90.0f };             sf.SetTabStops(0.0f, ts);             string s1 = "\tName\tHairColor\tEye Color\tHeight";             string s2 = "\tBob\tBrown\tBrown\t175cm";             g.DrawString(s1, bf, Brushes.Black, 20, 20, sf);             g.DrawString(s2, f, Brushes.Blue, 20, 20 + bf.Height, sf);             Console.WriteLine(bf.Height);             f.Dispose();             bf.Dispose();

  上面的代码创建了一个StringFormat对象和一个包含4个float值的数组,然后把该数组赋予StringFormat对象的SetTabStops属性,数组中的值表示每个制表位的宽度,所以第一个制表位距离边框矩形的左边10个像素,第二个制表位则距离第一个制表位70个像素,第三个制表位距离第二个制表位100个像素,第四个制表位距离第三个制表位90个像素。

没有专门的功能来创建居中对齐或右对齐的制表位,但是如果使用宽度固定的字体(monospace),就可以使用string.Format方法在通过drawstring方法绘制的字符串中使文本右对齐,模拟出右对齐制表符的效果。

Graphics g = e.Graphics;             g.FillRectangle(Brushes.White, this.ClientRectangle);             Font f = new Font("Times New Roman", 12);             Font bf = new Font(f, FontStyle.Bold);             StringFormat sf = new StringFormat();             float[] ts = { 100.0f, 100.0f, 90.0f };             sf.SetTabStops(0.0f, ts);             string fs = "{0}\t{1,8}\t{2,8}\t{3,8}";             string s1 = String.Format(fs, "Month", "Revenue", "Expense", "Profit");             string s2 = String.Format(fs, "January", "900.00", "1050.00", "-150.00");             string s3 = String.Format(fs, "February", "1100.00","990.00", "110.00");
            g.DrawString(s1, bf, Brushes.Black, 20, 20, sf);             g.DrawString(s2, f, Brushes.Blue, 20, 20 + bf.Height, sf);             g.DrawString(s3, f, Brushes.Blue, 20, 20 + bf.Height + f.Height, sf);             f.Dispose();             bf.Dispose();

上述程序设置了3个制表位,其宽度分别是100、100、90像素,然后创建一个模板格式化字符串fs,它描述了每个字符串如何进行格式化,{}括号中的每个表达式表示一个值,所以我们绘制的每个文本字符串都是由4个字符组成,他们用3个制表位分隔开。值是用基于0的索引来进行索引的,在绘制字符串时,用第0个值代替{0},用第1个值代替{1,8},以此类推,{}括号表达式中的第二个值如果存在,就是一个整数,表示该值是应该左对齐还是右对齐,并表示值得字符宽度。值为正采用右对齐,否则采用左对齐。本例得到一个左对齐的列和3个右对齐的列,其宽度为8个字符。如果使用非monospace字体获得这样对齐效果,就需要计算文本中子字符串的位置,自己绘制。

查找本机可用字体

使用System.Drawing.Text命名空间中的InstalledFontCollection类可以检查可用字体。下面的例子把本机所有可用字体输出到控制台:

FontFamily[] fontfamilies;             InstalledFontCollection installedFontCollection = new InstalledFontCollection();             fontfamilies = installedFontCollection.Families;             for (int i = 0; i < fontfamilies.Length; ++i)                 Console.WriteLine("FontFamily name: " + fontfamilies[i].Name);

另一种方法:FontFamily[] families = FontFamily.Families;                      foreach (FontFamily family in families)                     Console.WriteLine("FontFamily name: " + family.Name);

字体的规格和精确的文本位置

字体的规格:ascent、descent、leading和font height(leading的发音是“ledding”,因为印刷商把它用于在打印纸的字符行之间使用间距。)

有时印刷商使用另一种模型

Net使用第一个模型。

em(或em高度)定义为字体的点数。

如果要对文本的位置进行精确的控制,就需要通过绘制文本所用的字体系列实例的em值,把它们从designunits转换为绘图表面当前的GraphicsUnit,这将把字体规格的相对尺寸映射为绘图表面的实际测量尺寸。把em值从设计单位转换为GraphicsUnit:

MetricInGraphicsUnits = MetricInDesignUnits* (EmSizeInGraphicsUnits/EmSizeInDesignUnits)

在使用GDI+绘制文本时,可以对文本的可见质量进行很多控制,要制定质量的等级,可以使用Graphics类的TextRenderingHint属性,这个属性可以设置为textRenderingHint枚举中的任何一个值。一些值告诉GDI+在绘制较大字体时应该适当调整stem宽度(字形的stem是指主要的笔划,所以j有一个主要笔划,H有一个主要笔划),在使用stem宽度提示进行绘制时要花费更多的CPU时间。TextRenderingHint枚举的6个值:

下面的代码演示在windows 2000环境下使用标准反锯齿功能绘制文本的情况:

Graphics g = e.Graphics;

g.TextRenderingHint  TextRenderingHint.AntiAlias;

g.FillRectangle(Brushes.White,this.ClientRectangle);

g.DrawString("Hello",this.Font,Brushes.Black,0,0);

绘制独立于设备的图形时,可以使用Graphics.PageUnit属性,它是绘图表面的一个度量单位,可以把这个度量单位设置为英寸、像素、显示(1/96英寸)、毫米等。要协调图形的绘制和文本的绘制,一个简单的方法是把绘图表面的度量单位和字体的度量单位设置为同一个值,假定绘制一个图形,如标尺,它在其边界上用英寸标记进行标记,可以把Graphics.PageUnit属性设置为GraphicsUnit,Inch,然后以英寸为单位表示绘图操作的坐标,接着把字体的度量单位设置为GraphicsUnit.Inch,以英寸为单位表示文本的大小(假定GDI+把窗口的分辨率定义为96DPI,就可以创建一个线宽为1/96英寸的钢笔)。

Graphics g = e.Graphics;             g.PageUnit = GraphicsUnit.Inch;             Pen p = new Pen(Color.Black, 1 / 96f);             Font f = new Font("Times New Roman",16);             string s = "Abc";             SizeF sf = g.MeasureString(s, f);             g.DrawRectangle(p, 1, 1, sf.Width, sf.Height);             g.DrawString(s, f, Brushes.Black, 1, 1);             f.Dispose();             p.Dispose();

注意在创建字体时以点为单位显示字体的大小,而不是以英寸为单位,在运行这段代码时,字符串时用16点的Times New Roman绘制的,其位置距离窗口顶部1英寸,距离窗口左边1英寸。

字形是一个表示字符的图形符号,字体时一组字形,字样是一组字体,这组字体除了大小不同之外,其他都相同,字体系列是一组类似的字样,这些字样仅在样式上有区别(黑体或斜体)。

转载于:https://www.cnblogs.com/ttssrs/archive/2012/03/14/2396500.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值