System.Drawing font with background color

I have some in a class that puts text onto an image.  I want the ability to put a solid background behind the text but I'm having trouble getting the width to be the correct width (it's always too long).  I've tried change the unit and can't get it quiet right, anyone know what I'm missing (which is probably something simple)?  Or, another way to phrase the question is, how do I get the length of the text in a format that FillRectangle matches up with?  My snippet is in VB but I'll take either VB or C# suggestions, language is irrelevant for my purposes.
Dim Image As New Bitmap(_fileName)
Dim Gr As Graphics = Graphics.FromImage(Image)
Dim Brush As New System.Drawing.SolidBrush(_color)
Gr.FillRectangle(Brushes.Blue, _x, _y, (_font.SizeInPoints * _text.Length), _font.Height)
Gr.DrawString(Text, _font, Brush, _x, _y)

Open in new window

LVL 3
IUFITSAsked:
Who is Participating?
 
PaulHewsConnect With a Mentor Commented:
Use MeasureString:
Dim Image As New Bitmap(_fileName)
Dim Gr As Graphics = Graphics.FromImage(Image)
Dim Brush As New System.Drawing.SolidBrush(_color)
Dim rectSize As SizeF = Gr.MeasureString(Text, _font)
Gr.FillRectangle(Brushes.Blue, _x, _y, rectSize.Width, rectSize.Height)
Gr.DrawString(Text, _font, Brush, _x, _y)

Open in new window

0
 
Jaime OlivaresSoftware ArchitectCommented:
use MeasureString first:

Dim size As SizeF = Gr.MeasureString(Text, _font)

Then draw the rectangle:

Gr.FillRectangle(Brushes.Blue, _x, _y, size.Wdith, size.Height)
0
 
Jaime OlivaresSoftware ArchitectCommented:
Sorry, too slow typing.
0
 
wizrrConnect With a Mentor Commented:
You can use MeasureCharacterRanges.
http://www.developingstorm.com/2005/12/net-headache-measurestring.php

You also can use System.Windows.Forms.TextRenderer - text drawn/measured by this class is more accurate and fast.

Sometimes when you measuring string with spaces and same symbols "          aaaaaa" and "          aaaaaaaaaaaaaaaaaaaaaa" using MeasureString or MeasureCharacterRanges - you can get different measurement  of same character ranges (but this two strings with range from 2nd character to 16nd character is same) - this is known issue in .NET 1.0\1.1. Solution is to use StringFormat.GenericTypographic and Graphics.TextRenderingHint == TextRenderingHint.AntiAliasGridFit . TextRenderer is new in .NET 2.0 and can solve this problem also, but you can't paint gradiented text with it.
0
 
PaulHewsCommented:
The tiny extra space in MeasureString is fine for this application.  It adds space in the rectangle around the text.
0
All Courses

From novice to tech pro — start learning today.