WinForm-TextRenderer

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

發佈了27 篇原創文章 · 獲贊 21 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章