Autor Beitrag
RalphHoffmann
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Sa 10.10.15 16:30 
Hallo,
ich möchte
1.) den in einer RichTextBox eingegebenen, formatierten Text in einer Variablen speichern, ohne dass die Formatierungen verloren gehen.
2.) die Länge in Zentimetern eines Textes ermitteln, der in einer RichTextBox eingegeben und auch formatiert (fett, kursiv, unterstriche und jeglich Kombination)
werden kann.

Wie kann ich das bei C# machen?

Gruß
Ralph


Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am So 11.10.2015 um 08:57
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 11.10.15 09:17 
Hallo,

ich nehme mal an, du sprichst von der WinForms-RichTextBox (deswegen haben ich deinen Beitrag dorthin verschoben)?!

Mittels der RichTextBox.Rtf-Eigenschaft kommst du an den RTF-Code, in dem alle Formatierungen enthalten sind.

Was bedeutet für dich "in Zentimetern" - dies ist ja von der DPI-Eigenschaft abhängig (je nachdem wo du die RTB anzeigst: 17' Monitor, 24' Zoll Monitor, Drucker...)?
Du kannst aber mittels der Graphics.MeasureString-Methode(n) oder TextRenderer.MeasureText-Methode(n) die dargestellte Größe eines Textes in Pixeln messen. Diese betrachten aber nicht (direkt) die entsprechende Formatierung der RTB (such mal nach "C# RichTextBox measure height" im Internet).
RalphHoffmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Sa 07.11.15 17:16 
Stimmt davon sprach ich.

Mit der Länge in Zentimetern meinte ich es wörtlich. Ich habe inzwischen gefunden, was ich suchte. Hier der Code dazu:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
        //Umrechnen von Textlänge (nicht Anzahl der Zeichen!!!) in Millimeter
        private double Umrechnung(RichTextBox rtf)
        {
            //GetPosition... gibt den Punkt zurück, an dem sich das letzte Zeichen der RichTextBox befindet
            Point p = rtf.GetPositionFromCharIndex(rtf.TextLength);
            //Hier wird die Position für jede Zeile ermittel, wenn RitchTextBox.Multiline = true
            for (int i=0;i < rtf.Lines.Length;i++)
            {
                Point lp = rtf.GetPositionFromCharIndex(rtf.Lines[i].Length);
                if (lp.X > p.X)
                    p = lp;
            }
            return PixelToMillimeter(Convert.ToDouble(p.X + 1), rtf);
        }


        //Umrechnen der Textlänge [Pixel] in Millimeter
        private double PixelToMillimeter(double pixel, RichTextBox rtf)
        {
            //Textbox als Zeichenfläche besorgen, um...
            Graphics g = rtf.CreateGraphics();
            //...dort die Pixeldichte auslesen zu können, womit die Pixel zu Millimeter umgerechnet werden.
            return Math.Round(pixel * 25.4 / g.DpiX);
        }

Damit kann ich eine Zeichenkette (egal wie formatiert) in eine Länge -hier Millimeter- umrechnen.

Gruß

Ralph
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 07.11.15 19:28 
Das solltest du mit verschiedene Windows Zoom Stufen in den Windows Versionen ausprobieren die du unterstützen willst. Das konkrete Dpi Verhalten hat mehrmals hin und hergewechselt. Auf manchen Windows Versionen ist DpiX fix egal wie man zoomt und dann gibt es auch noch 2 Möglichkeiten (nativ vs. XP Kompatibilität) dazu noch ob du deine Anwendung als DPI Aware markiert hast und vermutlich noch ein paar weitere Abhängigkeiten die da reinspielen. Das ganze Dpi Ding ist mittlerweile zu Verfahren und komplex um auch nur anzunehmen das wenn ein Dpi abhängiges Verfahren auf einem System funktioniert das es das auch auf jedem/einem anderen auch macht.