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?
(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等属性进行格式控制。
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);
从图中可以看出,Graphics.DrawString()方法绘制的字符串是经过仿射变换的,而TextRenderer.DrawText()方法绘制的字符串是没有经过仿射变换的。
TextRenderer与Graphics的速度问题
(1)文本测量速度:
(2)文本绘制速度:
转自新浪博客: