2008-11-21 4 views

Antwort

4

Verwenden Graphics.MeasureString Methode

private void MeasureStringMin(PaintEventArgs e) 
{ 

    // Set up string. 
    string measureString = "Measure String"; 
    Font stringFont = new Font("Arial", 16); 

    // Measure string. 
    SizeF stringSize = new SizeF(); 
    stringSize = e.Graphics.MeasureString(measureString, stringFont); 

    // Draw rectangle representing size of string. 
    e.Graphics.DrawRectangle(new Pen(Color.Red, 1), 0.0F, 0.0F, stringSize.Width, stringSize.Height); 

    // Draw string to screen. 
    e.Graphics.DrawString(measureString, stringFont, Brushes.Black, new PointF(0, 0)); 
} 
1

Siehe meine Antwort auf eine ähnliche Frage here

ich Ihnen raten würde, dass auf jedes Zeichen verwenden und Berechnung der durchschnittlichen selbst

+1

Heh. Ich liebte die Methode, die Zeichenkette tatsächlich zu einer Bitmap zu zeichnen und dann Pixel zu lesen, um zu sehen, wie breit sie wirklich ist. Ineffizient, aber garantiert genau zu arbeiten. :) – MusiGenesis

1

I Ich habe noch nie eine durchschnittliche Eigenschaft Zeichenbreite in .NET gesehen. Sie können die Breite einer bestimmten Zeichenfolge in einer bestimmten Schriftart mithilfe von Graphics.MeasureString oder TextRenderer.MeasureString ermitteln.

4

Es gibt nicht unbedingt eine durchschnittliche Breite für Schriftarten, da Kerning eine Auswirkung haben kann, je nachdem, welche Buchstaben vor und nach einem gegebenen Buchstaben stehen.

Wenn Sie nicht fixierte Schriftarten in einem Szenario mit fester Breite verwenden möchten, besteht Ihre Hauptoption darin, die Zeichen mit der Breite des Großbuchstabens "W" zu belegen.

Andere haben bereits ein Beispiel bekommen die Breite einer bestimmten Zeichenfolge gegeben, aber Ihre Frage zu beantworten, ein den tatsächlichen Durchschnitt druckbare Zeichen erhalten Sie so etwas wie tun wollen könnte:

StringBuilder sb = new StringBuilder(); 

// Using the typical printable range 
for(char i=32;i<127;i++) 
{ 
    sb.Append(i); 
} 

string printableChars = sb.ToString(); 

// Choose your font 
Font stringFont = new Font("Arial", 16); 

// Now pass printableChars into MeasureString 
SizeF stringSize = new SizeF(); 
stringSize = e.Graphics.MeasureString(printableChars, stringFont); 

// Work out average width of printable characters 
double average = stringSize.Width/(double) printableChars.Length; 
+0

Dies funktioniert nicht wirklich, da einige benachbarte Zeichen in printableChars Kerning-Paare haben können. –

+3

Das war mir bewusst, das habe ich im ersten Satz gesagt. Aber ich habe nach dem Disclaimer die Frage beantwortet, die er gestellt hat. –

2

Tricky, wie Sie die Zeichenfrequenz auch verwenden sollten. Wenn Sie jemals Finnisch mit all seinen "i" und "l" s gesehen haben, werden Sie feststellen, dass sogar eine reine ASCII-Schriftart keine gut definierte durchschnittliche Zeichenbreite hat.

Verwandte Themen