Laden...

Wie funktioniert mein g.MeasureString()?

Erstellt von Lost-Ha(n)f-PHP vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.980 Views
Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 16 Jahren
Wie funktioniert mein g.MeasureString()?

hallo Leute,

der Drucker lässt mich immer noch nicht in Ruhe ^^

ich habe einen Text, den ich nur über eine bestimmte Länge drucken will. Die Anzahl der Reihen ist egal.

Hier erst mal mein Code:


int MaxLen = line.Width;
Size fSize;
int intChars, intLines;
StringFormat stringFormat = new StringFormat();
stringFormat.Trimming = StringTrimming.Word;
fSize = new Size(MaxLen, 20);
float calcWidth = g.MeasureString(Ware[2], line.SendFont).Width;
while(calcWidth > MaxLen)
{
    g.MeasureString(Ware[2], line.SendFont, fSize, stringFormat, out intChars, out intLines);
    Out += Ware[2].Substring(0,intChars)+"\r\n";
    Ware[2] = Ware[2].Substring(intChars);
}
Out += Ware[2];

Das funktioniert auch fast so, wie ich will. MaxLen ist die Angabe der Länge in Pixel.
calcWidth sollte die tatsächliche Länge des Textes sein. Die Schleife wird auch in der Richtigen Anzahl durchlaufen,
aber der Rückgabewert intChars, der angeben soll wie viele Zeichen ich nehmen kann, gibt so viele Zeichen zurück,
dass in den weiteren Druchläufen keinen Zeichen mehr da sind und der Text zu lang ist.

Wieso ist das so? Und was muss ich ändern?

Info:
Wenn ich die MaxLen durch 2 teile, dann kann ich einen Effekt erkennen, allerdings passt das dann nicht so, wie ich das möchte, aber der Text wird geteilt.

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

2.760 Beiträge seit 2006
vor 16 Jahren

Hab mal ein kleines Snippet gebaut was "denke ich" genau das macht:


      /// <summary>
      /// This method breaks the supplied string down into lines which will fit into
      /// the supplied container-width.
      /// </summary>
      /// <param name="xsText">The text to word wrap</param>
      /// <param name="font">The font which is used</param>
      /// <param name="i4ContainerWidth">The aimed width of a line</param>
      /// <param name="i4Padding">The padding which should be considered</param>
      /// <returns>A list of strings which will fit into the container's width</returns>
      protected virtual List<string> WordWrap(string xsText, Font font, int i4ContainerWidth, int i4Padding)
      {
         List<string> xlLines = new List<string>();
         int i4CurrentWordCount = 0;

         StringBuilder sb = new StringBuilder();

         if (MeasureString(xsText, font, i4Padding).Width > i4ContainerWidth)
         {
            string[] aWords = xsText.Split(new char[] { ' ' });
            foreach (string xsWord in aWords)
            {
               if (i4CurrentWordCount == aWords.Length)
                  xlLines.Add(sb.ToString());
               if (MeasureString(sb.ToString() + " " + xsWord, font, i4Padding).Width < i4ContainerWidth)
               {
                  sb.Append(" " + xsWord);
                  i4CurrentWordCount++;
               }
               else
               {
                  if (sb.Length > 0)
                  {
                     xlLines.Add(sb.ToString());
                     sb.Remove(0, sb.Length);
                     sb.Append(" " + xsWord);
                  }
                  if (sb.Length == 0)
                  {
                     sb.Append(xsWord);
                  }
                  i4CurrentWordCount++;
               }
            }
            if (i4CurrentWordCount == aWords.Length)
               xlLines.Add(sb.ToString());
         }
         else
         {
            xlLines.Add(xsText);
         }

         return xlLines;
      }

      /// <summary>
      /// This method measures a string and returns it's size.
      /// </summary>
      /// <param name="xsString">The string to measure</param>
      /// <param name="font">The font which is used</param>
      /// <param name="r4Padding"></param>
      /// <returns>The size of the string</returns>
      protected virtual Size MeasureString(string xsString, Font font, int i4Padding)
      {
         Graphics grfx = Graphics.FromImage(new Bitmap(10, 10));
         SizeF stringSize = new SizeF();
         stringSize = grfx.MeasureString(xsString, font);
         grfx.Dispose();
         stringSize.Width += 2 * i4Padding;

         return new Size((int)stringSize.Width, (int)stringSize.Height);
      }

Keine Ahnung ob das Ding 100% funzt, habe das nur mal schnell rauskopiert.