2008-11-21 4 views

Répondre

4

Utilisez Graphics.MeasureString Méthode

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

Voir ma réponse à une question similaire here

Je suppose que vous auriez à utiliser sur tous les caractères et calculer la moyenne vous

+1

Heh. J'ai adoré la méthode consistant à dessiner la chaîne dans un bitmap, puis à lire les pixels pour voir à quel point elle est large. Inefficace mais garanti de fonctionner exactement. :) – MusiGenesis

1

I Je n'ai jamais vu une propriété de largeur de caractère moyenne dans .NET. Vous pouvez obtenir la largeur d'une chaîne particulière dans une police particulière en utilisant Graphics.MeasureString ou TextRenderer.MeasureString.

4

Il n'y a pas strictement une largeur moyenne pour les polices car le crénage peut avoir un effet selon les lettres qui sont avant et après une lettre donnée.

Si vous souhaitez utiliser des polices de taille non fixe dans un scénario à largeur fixe, vous pouvez espacer les caractères de la largeur du caractère majuscule «W».

D'autres ont déjà donné un exemple d'obtenir la largeur d'une chaîne spécifiée, mais pour répondre à votre question, pour obtenir une moyenne précise de caractères imprimables que vous voudrez peut-être faire quelque chose comme:

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

Cela ne fonctionne pas vraiment, car certains caractères adjacents dans printableChars peuvent avoir des paires de crénage. –

+3

J'étais au courant de cela, je l'ai dit dans la première phrase. Mais après cet avertissement, j'ai répondu à la question qu'il a posée. –

2

Tricky, comme vous devriez utiliser la fréquence de caractères aussi bien. Si vous avez déjà vu le finnois, avec tous ses "i" et "l", vous vous rendrez compte que même une police ASCII pure n'a pas de largeur de caractère moyenne bien définie.

Questions connexes