DevTips.NET

Eigen WordWrap methode

Het afbreken van teksten zodat ze passen in een control zoals een TextBox hoeft meestal niet expliciet gedaan te worden. Voor het afdrukken van teksten gaat dat echter niet altijd op. Vandaar deze eigen WordWrap methode die rekening houdt met het geselecteerde lettertype. 

De aanroep is als volgt:

string Text = textBoxInput.Text; // de oorspronkelijke lange tekst
int MaxWidth = 300; // de maximale breedte in pixels
Font SelectedFond = new Font("Arial", 16); // het gebruikte lettertype   
textBoxOutput.Text = WordWrap(Text, MaxWidth, SelectedFont, textBoxOutput);

.NET

Code

using System;
using System.Windows.Forms;
using System.Drawing;
 
 
public static string WordWrap(string text,
      int maxWidth, Font selectedFont, Control controlSource) {
 
  System.Text.StringBuilder textbuilder = new System.Text.StringBuilder();
 
  Graphics g = controlSource.CreateGraphics();
  g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
 
  while(text.Length>0) 
{
    string textpart = GetStringPart(text, maxWidth, selectedFont, g);   
    textbuilder.Append(textpart.TrimStart(" ".ToCharArray()));
    textbuilder.Append(Environment.NewLine);
    text = text.Remove(0, textpart.Length);   
  }
  return textbuilder.ToString();
  }
 
private static string GetStringPart(string text, int maxWidth,
      Font selectedFont, Graphics g) {
 
  // initialiseer de lengte
  int Length = 1;
 
  // bepaal de maximaal mogelijke stringlengte binnen de maximale
  // breedte
  SizeF TextSize; 
  do {
    TextSize = g.MeasureString(text.Substring(0,Length), selectedFont);
    Length += 1;;
  }
  while (TextSize.Width < maxWidth && text.Length > Length);
 
  // onthoudt deze maximale lengte voor later
  int PreferredLength = Length;
 
  // ga terug naar de eerst voorkomende spatie
  while ((Length>0 && Length<text.Length) &&
      !text.Substring(Length,1).Equals(" ")) {
    Length -= 1;   
  }
 
  // als de string geen spatie bevat is Length teruggegaan
  // naar 0. In dat geval pakken we de oorspronkelijk gevonden lengte.
 
  if(Length==0) {
    Length = PreferredLength;
  }
 
  return text.Substring(0, Length);
}
comments powered by Disqus