2010-01-22 2 views
5

Hi Ich benutze TextRenderer.MeasureText() -Methode, um die Textbreite für eine bestimmte Schriftart zu messen. Ich verwende die Schriftart Arial Unicode MS zur Messung der Breite, eine Unicode-Schriftart, die Zeichen für alle Sprachen enthält. Die Methode gibt unterschiedliche Breiten auf verschiedenen Servern zurück. Auf beiden Computern ist Windows 2003 und .net 3.5 SP1 installiert. HierProblem mit TextRenderer.MeasureText

ist der Code, den wir

verwendet
using (Graphics g = Graphics.FromImage(new Bitmap(1, 1))) 
{     
    width = TextRenderer.MeasureText(g, word, textFont, new Size(5, 5), TextFormatFlags.NoPadding).Width; 
} 

Jede Idee, warum dies geschieht?

Ich verwende C# 2.0

+0

Warum _was_ passiert? Du hast gerade einen Code und keine Problembeschreibung gepostet. – Oded

+0

Hallo, das Problem ist, wenn Sie den Code auf verschiedenen Maschinen ausführen, gibt es unterschiedliche Breiten, wenn ich also mehrere Server habe, wird jeder Server eine andere Breite zurückgeben, was nicht akzeptabel ist ... Und nicht alle Maschinen geben unterschiedliche Werte zurück nur einige von ihnen ..! – Amit

Antwort

11

measureText nicht genau bekannt ist.

Heres ein besserer Weg:

protected int _MeasureDisplayStringWidth (Graphics graphics, string text, Font font) 
    { 
     if (text == "") 
      return 0; 

     StringFormat format = new StringFormat (StringFormat.GenericDefault); 
     RectangleF rect = new RectangleF (0, 0, 1000, 1000); 
     CharacterRange[] ranges = { new CharacterRange (0, text.Length) }; 
     Region[] regions = new Region[1]; 

     format.SetMeasurableCharacterRanges (ranges); 
     format.FormatFlags = StringFormatFlags.MeasureTrailingSpaces; 

     regions = graphics.MeasureCharacterRanges (text, font, rect, format); 
     rect = regions[0].GetBounds (graphics); 

     return (int)(rect.Right); 
    } 
+0

Hey Danke für die Eingaben ... Lass mich das gleiche versuchen. – Amit

+0

Hey Das funktioniert gut ..! Vielen Dank .. – Amit

11
//-------------------------------------------------------------------------------------- 
// MeasureText always adds about 1/2 em width of white space on the right, 
// even when NoPadding is specified. It returns zero for an empty string. 
// To get the precise string width, measure the width of a string containing a 
// single period and subtract that from the width of our original string plus a period. 
//-------------------------------------------------------------------------------------- 

public static Size MeasureText(string Text, Font Font) { 
    TextFormatFlags flags 
    = TextFormatFlags.Left 
    | TextFormatFlags.Top 
    | TextFormatFlags.NoPadding 
    | TextFormatFlags.NoPrefix; 
    Size szProposed = new Size(int.MaxValue, int.MaxValue); 
    Size sz1 = TextRenderer.MeasureText(".", Font, szProposed, flags); 
    Size sz2 = TextRenderer.MeasureText(Text + ".", Font, szProposed, flags); 
    return new Size(sz2.Width - sz1.Width, sz2.Height); 
} 
+0

danke für das Update .... – Amit

+0

Tolle Lösung. MSDN muss Informationen dazu haben, aber schließlich hat es nicht. –

+0

Danke. Half mir. Auch wenn das Ding mit den 1/2 em überhaupt sehr peinlich ist. –

1

Wir hatten ein ähnliches Problem mehrere Jahre zurück. In unserem Fall hatten wir aus irgendeinem Grund verschiedene Versionen der gleichen Schriftart installiert auf zwei verschiedenen Maschinen. Die OS-Version war die gleiche, aber die Schriftart war anders.

Da Sie normalerweise keine Systemschriftart mit Ihrer Anwendungskonfiguration bereitstellen, können die Mess- und Ausgabeergebnisse je nach Schriftart von Maschine zu Maschine variieren.

Da Sie sagen ...

Und nicht alle Maschinen zurückgeben verschiedene Werte nur einige von ihnen ..!

... das ist etwas, nach dem ich suchen würde.