Laden...

Text in Blocksatz ausgeben

Erstellt von mcpd vor 13 Jahren Letzter Beitrag vor 6 Jahren 11.225 Views
M
mcpd Themenstarter:in
174 Beiträge seit 2009
vor 13 Jahren
Text in Blocksatz ausgeben

Hallo Leute,

habe mal wieder ein Problemchen und hoffe Ihr könnt mir helfen.
Ich möchte gerne einen Text in Blocksatz formatieren. Gibt es unter
.NET eine Möglichkeit bzw. hat jemand damit schon Erfahrung?

Gruß
mcpd

Gelöschter Account
vor 13 Jahren

mit .net bordmitteln geht das nciht ohne weiteres....

M
mcpd Themenstarter:in
174 Beiträge seit 2009
vor 13 Jahren

Hallo,

so schnell trifft man sich wieder. Das habe ich auch schon bemerkt, das .NET dafür
keine Mittel zur Verfügung stellt.

Welche Möglichkeiten habe ich? Gibt es evtl, ein Code-Snippet?

Gruß

Gelöschter Account
vor 13 Jahren

du musst viel mit Textrenderer.MeasureText arbeiten... prinzipiell ist das ja eigendlich recht einfach. du misst jedes wort aus und berechnest dann wieviele wörter in eine zeile passen. dann berechnest du noch die abstände und zeichnest die wörter entsprechend der abstände.

M
mcpd Themenstarter:in
174 Beiträge seit 2009
vor 13 Jahren

Danke. Hast Du mal ein Beispiel auf Lager?

Gruß

Gelöschter Account
vor 13 Jahren

nein, sry.
und selbst wenn:
bitte beachte [Hinweis] Wie poste ich richtig? 4b

M
mcpd Themenstarter:in
174 Beiträge seit 2009
vor 13 Jahren

O.K. Danke Dir.

Gruß

5.742 Beiträge seit 2007
vor 13 Jahren

mit .net bordmitteln geht das nciht ohne weiteres....

Nicht ganz - mit GDI+-Mitteln nicht.
WPF bietet hier tatsächlich Unterstützung.

Ansonsten sollten auch einige Reportingframeworks hierzu in der Lage sein.

M
mcpd Themenstarter:in
174 Beiträge seit 2009
vor 13 Jahren

Hallo,

kann ich denn WPF ohne weiteres in Windows-Form-App integrieren?

Gruß
mcpd

Gelöschter Account
vor 13 Jahren

ajin. ohne weiteres geht es nciht aber es geht.

M
mcpd Themenstarter:in
174 Beiträge seit 2009
vor 13 Jahren

Hallo JAck30lena,

WPF-Controls kann ich in Win-Forms-App verwenden. Aber funktioniert
ein Verweis auf die Assembly "PresentationCore.dll" und die Verwendung
deren Klassen in einer Win-Forms-App?

Bsp. Klasse "TextFormatter"

Gruß

5.657 Beiträge seit 2006
vor 13 Jahren

Klar, warum nicht? Probiers doch einfach mal aus...

Weeks of programming can save you hours of planning

I
1.739 Beiträge seit 2005
vor 13 Jahren

Was verstehst du unter Blocksatz?
Sollen die Abstände der Wörter angepasst werden oder auch die Buchstabenabstände in den Wörtern?

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo mcpd,
wir hatten in der UNI-mal diesbezüglich eine Aufgabe (in C). Das was du brauchst nennt sich "Word Wrap Function" mit einer fixen Zeichenlänge pro Zeile.
Probier erst mal auf eigener Faust, wenn es dann wirklich nicht klappen sollte kann ich das komplette Beispiel hier posten.

Gruß Michael.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

M
mcpd Themenstarter:in
174 Beiträge seit 2009
vor 13 Jahren

Hallo,

erst einmal Sorry für die verspätete Reaktion von mir. Ich war zu sehr mit
meinem oben beschriebenen Problem beschäftigt. Ich denke aber, dass ich dem
Ziel schon sehr nahe gekommen bin und endlich Licht am Ende des Tunnels sehe.

Um den Text in einer TextBox-Control im Blocksatz darstellen zu können, blieb
mir erst einmal nichts anderes übrig "neue Technologien" - sprich WPF - mit meiner
"alten Technologie" - sprich Windows-Forms-Applikation - zu verknüpfen.

Der erste Schritt war das Windows-Control "ElementHost" in meiner App. einzusetzen, welches mir die Möglichkeit bietet WPF-Steuerelemente bzw. WPF-User-Controls in Windows-Forms zu hosten. Damit hoste ich jetzt das WPF-Control "TextBox", setze entsprechende Properties (Bsp. TextAllignment.Justify) und füge es meiner Windows-Forms hinzu. Voraussetzungen dafür sind natürlich noch das Einbinden zusätzlicher Assemblys.

2.921 Beiträge seit 2005
vor 6 Jahren

Weiss nicht mehr, ob das mein Code ist, oder woher ich ihn habe, aber, ist zumindest eine Möglichkeit, je nachdem was man genau braucht, muss man vielleicht auch mit Graphics / Measurement u.a. arbeiten, etc.:


  public static class StringExtensions
    {
        /// <summary>
        /// Word wraps the given text to fit within the specified width.
        /// </summary>
        /// <param name="text">Text to be word wrapped</param>
        /// <param name="width">Width, in characters, to which the text
        /// should be word wrapped</param>
        /// <returns>The modified text</returns>
        public static string WordWrap(this string text, int width, string returnCharSequence = "\r\n")
        {
            int position, next;
            StringBuilder stringBuilder = new StringBuilder();

            // Lucidity check
            if (width < 1)
            {
                return text;
            }

            // Parse each line of text
            for (position = 0; position < text.Length; position = next)
            {
                // Find end of line
                int endOfLine = text.IndexOf(returnCharSequence, position);
                if (endOfLine == -1)
                {
                    next = endOfLine = text.Length;
                }
                else
                {
                    next = endOfLine + returnCharSequence.Length;
                }

                // Copy this line of text, breaking into smaller lines as needed
                if (endOfLine > position)
                {
                    do
                    {
                        int length = endOfLine - position;
                        if (length > width)
                        {
                            length = BreakLine(text, position, width);
                        }
                        stringBuilder.Append(text, position, length);
                        stringBuilder.Append(returnCharSequence);

                        // Trim whitespace following break
                        position += length;
                        while (position < endOfLine && Char.IsWhiteSpace(text[position]))
                        {
                            position++;
                        }
                    }
                    while (endOfLine > position);
                }
                else
                {
                    stringBuilder.Append(returnCharSequence); // Empty line
                }
            }
            return stringBuilder.ToString();
        }

        /// <summary>
        /// Locates position to break the given line so as to avoid
        /// breaking words.
        /// </summary>
        /// <param name="text">String that contains line of text</param>
        /// <param name="position">Index where line of text starts</param>
        /// <param name="maximum">Maximum line length</param>
        /// <returns>The modified line length</returns>
        private static int BreakLine(string text, int position, int maximum)
        {
            // Find last whitespace in line
            int i = maximum;
            while (i >= 0 && !Char.IsWhiteSpace(text[position + i]))
            {
                i--;
            }

            // If no whitespace found, break at maximum length
            if (i < 0)
            {
                return maximum;
            }

            // Find start of whitespace
            while (i >= 0 && Char.IsWhiteSpace(text[position + i]))
            {
                i--;
            }

            // Return length of text before whitespace
            return i + 1;
        }
    }

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.