WinForm-TextRenderer

来源:互联网 发布:为什么俞飞鸿抗老 知乎 编辑:程序博客网 时间:2024/06/03 22:42

2009-08-22

TextRenderer
TextRenderer是一个sealed类,无法继承。该类位于System.Windows.Forms命名空间中,提供了一组静态方法,可用于在 Windows 窗体控件上测量绘制文本:DrawText与MeasureText。这两个方法都有几个重载方法:
DrawText(IDeviceContext dc, string text, Font font, Point pt, Color foreColor);
DrawText(IDeviceContext dc, string text, Font font, Rectangle bounds, Color foreColor);
......
Size MeasureText(string text, Font font);
Size MeasureText(string text, Font font, Size proposedSize);
Size MeasureText(string text, Font font, Size proposedSize, TextFormatFlags flags);
......
Graphics的DrawString方法:
Graphics.DrawString(string, Font, Brush, Rectangle, StringFormat)
为什么要用TextRenderer?
.NET 2.0里面新加了一个TextRenderer的类. TextRender使用GDI画/测量Text, 而不是GDI 。而为什么使用TextRenerer可能会比Graphics.Draw/MeasureString好一些呢? 有以下3个原因:
(1)对复杂的国际字符GDI比GDI 画的好一些. 如果Windows新支持一种语言, GDI会比GDI 支持的好一些。
(2)Windows Form里面的Control大多都用GDI来绘制字符串. 所以如果有时候你需要绘制和Control上的字符串完全一样的字符串, 或者测量Control上字符串准确的大小的话, 你必须使用GDI, 而非GDI .
(3)使用GDI 绘制/测量的结果会跟GDI有一定区别, 特别是字符串很长的情况下。GDI 会在程序运行时一直锁定字体文件, 从而很难更新字体.
(4)有的地方不得不使用TextRenderer来绘制文本。之前遇到了Graphics的一个问题,在美化ListBox控件时,在DrawItem事件的处理程序中使用Graphics.DrawString,发现不能正确显示。琢磨了半天,觉得自己代码也没有写错,但就是无法正确显示。后来看了人家的DrawItem事件代码中几乎都使用TextRenderer的DrawText方法,于是将之前的所有DrawString方法改为DrawText方法,奇迹般地发现能够正确的显示了。具体为什么出现这样的问题不得而知,但是至少利用TextRenderer解决了问题。
TextRenderer与Graphics的区别
(1)Graphics.DrawString方法是使用GDI 描绘文字列的,而TextRenderer.DrawText方法是使用GDI描绘的。
(2)TextRenderer.DrawText方法,是不能使用在印刷时使用的。
(3)指定文字的颜色时,Graphics使用Bursh格式刷,而TextRenderer使用Color描绘。因此,Graphics可以使用许多特殊的效果,如颜色渐变等,而TextRenderer却无法完成。
字符的串格式化
TextFormatFlags:TextRenderer.DrawText的一个参数,是一个枚举值,用于控制字符串格式。
StringFormat:System.Drawing命名空间中的一个sealed类, Graphics.DrawString的一个参数,也是用于字符串格式的控制。可以通过Alignment、FormatFlags、LineAlignment、Trimming等属性进行格式控制。

2010-07-14

TextRenderer方法中使用的坐标是不会经过仿射变换的。

TextRenderer.DrawText()与Graphics.DrawString()都可以进行绘制文本,在我前面的博文《TextRenderer》里面有详细的介绍。这里补充一点,那就是Graphics的所有仿射变换对TextRenderer不起作用,也即TextRenderer方法中使用的坐标是不会经过仿射变换的。

如下代码:

Rectangle rect = new Rectangle(0,0,200,30);
g.TranslateTransform(50, 50); //平移变换
g.DrawString("这是Graphics.DrawString方法", this.Font, Brushes.Red, rect);

TextRenderer.DrawText(g, "这是TextRenderer.DrawText方法", this.Font, rect, Color.Blue);

可能有人会觉得上面的两个字符串应该会叠加到一块,因为它们都绘制在同一个矩形框中,但实际结果如下图:

WinForm--Q&A
从图中可以看出,Graphics.DrawString()方法绘制的字符串是经过仿射变换的,而TextRenderer.DrawText()方法绘制的字符串是没有经过仿射变换的。


2010-08-24
TextRenderer与Graphics的速度问题

最近在做一个GIS系统,牵涉到一些图形的绘制。当发现绘制出来的文本的位置不是很理想时,想到了TextRenderer比Graphics能更好的进行格式控制、更精确地绘制文本,所以将以前用Graphics绘制的代码都改成了利用TextRenderer进行绘制。

修改之后,文本确实是能精确的绘制了,但是又出现了一个问题就是,速度一下就慢了不少。所以,这才发现他们之间的速度差别。下面进行比较比较:

(1)文本测量速度:
string text = "this is a test string";
int num = 100000;
for (int i = 0; i < num; i ) graphics.MeasureString(text, this.Font);
for (int i = 0; i < num; i ) TextRenderer.MeasureText(text, this.Font);
100000次的文本测量,Graphics.MeasureString耗费106毫秒,TextRenderer.MeasureText使用了421毫秒。

(2)文本绘制速度:

string text = "this is a test string";
int num = 100000;

Point pos = new Point(0, 0);
for (int i = 0; i < num; i ) graphics.DrawString(text, Font, Brushes.Black, pos);
for (int i = 0; i < num; i ) TextRenderer.DrawText(graphics, text, Font, pos, Color.Black);

100000次的文本绘制,Graphics.DrawString耗费578毫秒,TextRenderer.DrawText使用了921毫秒。

总结:不管是文本测量方面,还是文本绘制方面,Graphics都比TextRenderer要快。


转自:http://blog.sina.com.cn/s/blog_48a45b950100eqe7.html

0 0
原创粉丝点击