两种方式TextRenderer.DrawText
注意:默认在每次绘制的文本左右有padding,即使参数中设置了TextFormatFlags.NoPadding也是一样,因此在分段绘制文本时(比如绘制搜索结果文本中高亮一部分时),每次绘制前在定位传递Point参数时,需要进行修正,减去相应个数的padding的宽度(由于需要转成int,所以会有误差)
Introduced in .NET 2.0TextRenderer is the recommended text rendering method, using GDI library under the hood it provided the best looking text, accurate measurement and proper international support.
Using TextRenderer.DrawText and TextRenderer.MeasureText is straightforward and well documented so I won't go into details. The only annoying issue is the padding added to the left (1/6 em) and right (1/4 em) of the drawn/measured text as describedhere. To have exact draw/measure of text you need the subtract (1/6font.GetHeight()) from left corner during draw and (2.5/6font.GetHeight()) from the measured width (Figure 2).e.Graphics.DrawString
1privatevoid smartTipListBox_DrawItem(object sender, DrawItemEventArgs e) 2 { 3 ListBox eObj = senderas ListBox; 4 5 e.DrawBackground(); 6 7string entireText = ((EntireInfo)eObj.Items[e.Index]).VarName; 8 9int index = entireText.IndexOf(searchingStr, StringComparison.InvariantCultureIgnoreCase); 10if (index >=0) 11 { 12 TextFormatFlags formatFlags = TextFormatFlags.NoPadding | TextFormatFlags.SingleLine; 13//TextFormatFlags formatFlags = TextFormatFlags.TextBoxControl | TextFormatFlags.WordBreak;14int leftAndTopPadding =5; 15string headText = entireText.Substring(0, index); 16string matchedText = entireText.Substring(index, searchingStr.Length); 17string tailText = entireText.Substring(index + matchedText.Length, entireText.Length - index - matchedText.Length); 18int headTextPartWidth = TextRenderer.MeasureText(headText, e.Font,new Size(int.MaxValue,int.MaxValue), formatFlags).Width; 19int highlightedTextWidth = TextRenderer.MeasureText(matchedText, e.Font,new Size(int.MaxValue,int.MaxValue), formatFlags).Width; 20int yPosition = e.Index * smartTipListBox.ItemHeight + leftAndTopPadding; 21int leftTextMargin = (int)(1 * e.Font.GetHeight() /6); 22int rightTextMargin = (int)(1 * e.Font.GetHeight() /4); 23if (index >0) 24 { 25 TextRenderer.DrawText(e.Graphics, headText, e.Font,new Point(leftAndTopPadding, yPosition), Color.Black, formatFlags); 26 TextRenderer.DrawText(e.Graphics, matchedText, e.Font,new Point(leftAndTopPadding + headTextPartWidth -2 * leftTextMargin - rightTextMargin, yPosition), Color.Red, formatFlags); 27 TextRenderer.DrawText(e.Graphics, tailText, e.Font,new Point(leftAndTopPadding + headTextPartWidth + highlightedTextWidth -3 * leftTextMargin -2 * rightTextMargin, yPosition), Color.Black, formatFlags); 28 } 29else30 { 31 TextRenderer.DrawText(e.Graphics, matchedText, e.Font,new Point(leftAndTopPadding + headTextPartWidth, yPosition), Color.Red, formatFlags); 32 TextRenderer.DrawText(e.Graphics, tailText, e.Font,new Point(leftAndTopPadding + headTextPartWidth + highlightedTextWidth -2 * leftTextMargin - rightTextMargin, yPosition), Color.Black, formatFlags); 33 } 3435//Brush blackBrush = Brushes.Black; 36//Brush redBrush = Brushes.Red; 37//Rectangle initRectangle = e.Bounds; 38//e.Graphics.DrawString(entireText.Substring(0, index), e.Font, blackBrush, initRectangle, null); 39//initRectangle.Offset(Convert.ToInt32(e.Graphics.MeasureString(entireText.Substring(0, index), e.Font).Width), 0); 40//e.Graphics.DrawString(entireText.Substring(index, searchingStr.Length), e.Font, redBrush, initRectangle, null); 41//initRectangle.Offset(Convert.ToInt32(e.Graphics.MeasureString(entireText.Substring(index, searchingStr.Length), e.Font).Width), 0); 42//e.Graphics.DrawString(entireText.Substring(index + searchingStr.Length, entireText.Length - index - searchingStr.Length), e.Font, blackBrush, initRectangle, null);43 } 44 }