2010-12-29 8 views
5

Was ich mache, ist die Pixelgröße einer Zeichenkette zu erhalten und sie in hundertstel Zoll zu konvertieren (dh. Pixel/DPI = Zoll, Zoll * 100 = Hundertstel Zoll). Hier ist mein Code:Warum misst TextRenderer.MeasureText den Text nicht richtig, wenn in C# größere Schriftarten verwendet werden?

private static SizeF TextSize(string text, Font txtFnt) 
{ 
    SizeF txtSize = new SizeF(); 

    // The size returned is 'Size(int width, int height)' where width and height 
    // are the dimensions of the string in pixels 
    Size s = System.Windows.Forms.TextRenderer.MeasureText(text, txtFnt); 

    // Value based on normal DPI settings of 96 
    txtSize.Width = (float)Math.Ceiling((float)s.Width/96f * 100f); 
    txtSize.Height = (float)Math.Ceiling((float)s.Height/96f * 100f); 

    return txtSize; 
} 

Nun Schriftart Arial mit dieser funktioniert alles in Ordnung für Schriften kleiner als 12, aber nach, dass Zeichen immer abgeschnitten gestartet werden, weil die berechnete Größe ist kleiner als die tatsächliche Größe. Ich weiß, dass meine DPI-Einstellungen auf 96 gesetzt sind meine Fonts alle gleich mit der Änderung in der Schriftgröße definiert sind:

Font myFont = new Font("Arial", <font size>, FontStyle.Regular, GraphicsUnit.Point); 

Ich glaube, dass ich GraphicsUnit.Point verwenden, weil die benutzerdefinierte Steuer ich die Saiten an Zeichnung zu, aber ist die GraphicsUnit Angelegenheit?

Funktioniert die MeasureText Funktion sogar richtig, oder läuft noch etwas anderes?

EDIT

I auf eine benutzerdefinierte Druckvorschau Kontrolle am Zeichnen. Die Einheiten im Druckvorschau-Steuerelement sind 'Zoll/100' (daher die Konvertierung). Ich glaube, dass der Text, die Bilder usw. mit dem Druckergrafikobjekt gezeichnet werden, aber ich bin mir nicht ganz sicher.

+1

Ich habe als mit dieser Funktion Probleme hatte auch ich bin gespannt, was die Leute sagen. –

Antwort

3

Vor einer langen Zeit stieß ich auf ein ähnliches Problem, insbesondere Text ein Textfeld zu messen. Der Kern der Sache ist dies: Es gibt zwei Hauptwege zum Zeichnen von Text. Die Win32-API und System.Drawing. Wenn Sie versuchen, Text in einem Textfeld zu messen, wird es mithilfe der Win32-API gezeichnet und Sie müssen es mithilfe der Win32-API messen. Wenn Sie den von System.Drawing gezeichneten Text messen, stimmen Ihre Messungen mit .net überein.

Grundsätzlich verwendet ein Forms-Textfeld die Win32-API zum Layout und Zeichnen und Messungen müssen auch von Win32 kommen.

Sie haben nicht gesagt, was genau Sie gemessen haben und wo, so dass diese Antwort möglicherweise nicht einmal gilt.

+0

Das kann mein Problem sein, weil ich glaube, dass das Steuerelement ein System.Drawing.Graphics-Objekt verwendet, um alles zu zeichnen, aber ich bin mir nicht sicher. Ich werde das testen. –

0

Die Optionen machen einen Unterschied und je größer die Schrift, desto größer die Auswirkung. Hier sind die Einstellungen, die für uns am besten funktionierten - Ihre Laufleistung kann variieren. (Code ist komisch, weil wir dies in J # verwenden):

private static System.Drawing.StringFormat createStringFormat() 
{ 

    System.Drawing.StringFormat fmt = new System.Drawing.StringFormat (System.Drawing.StringFormat.get_GenericTypographic()); 
    fmt.set_Trimming(System.Drawing.StringTrimming.None); 
    fmt.set_FormatFlags(System.Drawing.StringFormatFlags.MeasureTrailingSpaces | System.Drawing.StringFormatFlags.NoWrap); 
    return fmt; 
} 
Verwandte Themen