2009-06-29 7 views
0

J'ai une série de boutons qui affichent les noms de fichiers. Si je définis la propriété Text lorsque le nom de fichier est plus large que le nombre de pixels disponibles, le texte "enveloppe" et à la place si le texte affiché LeftMiddle est affiché LeftTop. Par conséquent, je n'affiche que le nombre de caractères pouvant être affichés (en utilisant la méthode PathCompactPathEx()).Comment faire pour déterminer les pixels disponibles pour le texte dans System.Windows.Forms.Button

Cependant - Comment puis-je savoir combien de pixels sont disponibles? Mon approche actuelle est:

button.Width - button.Image.Width - button.Padding.Horizontal 

Cela ne fonctionne pas toujours et parfois le texte enveloppe encore.

Des indices sur la manière correcte de déterminer le nombre de pixels disponibles pour le texte?

Répondre

2

La meilleure approche que vous pouvez obtenir est de souscrire à l'événement de peinture (ou faire descendant Button et passer outre OnPaint), et la chaîne dessiner la façon suivante:

private void OnPaint(object sender, PaintEventArgs) 
{ 
    Button SenderButton = (Button)sender; 
    Rectangle TextRect = SenderButton.ClientRectangle; 
    TextRect.Inflate(-10, -5); // You can use any rectangle you want 
    // To avoid internal Button text drawing, assign "" to Button.Text, and use Tag instead 
    string Text = (string)SenderButton.Tag; 
    e.Graphics.DrawText(e.Graphics, Text, SenderButton.Font, TextRect, SenderButton.ForeColor, 
     TextFormatFlags.PathEllipsis | TextFormatFlags.NoPrefix); 
} 

Ceci est la seule méthode qui garantie que vous ne avoir à nouveau l'emballage. Toute mesure de largeur (y compris MeasureString) peut différer du traitement interne de la peinture des boutons, et vous obtiendrez un emballage.

+0

Oui, je suppose que je pourrais - étant donné que je connais environ l'espace disponible (voir question). Je suis toujours curieux de savoir pourquoi TextRenderer.MeasureText() peut différer du traitement interne de la peinture des boutons ... Le nombre de pixels disponibles pour le texte dans un bouton doit sûrement pouvoir être calculé? – JohnBarton

+0

Parce que le bouton peut peindre le texte de différentes manières. Par exemple, lorsque FlatStyle == System, le texte est peint par le système, si FlatStyle == Default, la peinture de texte dépend de la propriété UseCompatibleTextRendering, et ainsi de suite. Vous ne connaissez également pas les marges de texte utilisées par la classe de boutons dans différents modes de peinture. – arbiter

+0

Merci d'avoir pris le temps de répondre à la question, très appréciée. – JohnBarton

0

Peut-être que vous pourriez utiliser une police monospaced comme Courier, si vous déterminez la largeur de chaque omble chevalier du pixel, alors vous avez juste besoin de prendre soin de ne pas dépasser la largeur de votre zone de texte

Hope this helps

+0

La question était de savoir comment calculer l'espace disponible dans un bouton pour le texte. FYI - voir le commentaire ci-dessus. Il n'est pas nécessaire d'utiliser une police à espacement fixe, vous pouvez utiliser des méthodes pour déterminer la largeur d'une chaîne pour n'importe quelle police. – JohnBarton

2

Vous pouvez Utilisez Graphics.MeasureString pour déterminer le nombre réel de pixels utilisés par un texte particulier en utilisant une police particulière.
Il y a aussi Graphics.MeasureCharacterRanges qui, je crois, peut être plus précis pour l'alignement du texte mais je ne l'ai pas personnellement utilisé.

+0

Excuses - Je connais déjà large la chaîne est - Je cherche comment déterminer le nombre de pixels disponibles dans le bouton - afin que je puisse ensuite déterminer combien de caractères à dessiner. Le commentaire de code dans ma question montre comment je suis en train de calculer l'espace disponible, mais cela ne fonctionne pas toujours car le texte s'enroule toujours. FYI - TextRenderer.MeasureText() est préférable aux méthodes de la classe Graphics car il prend en compte les paramètres DPI. – JohnBarton

Questions connexes