none
Zwei Fragen (RichTextBox)

    Frage

  • Hallo

    Noch immer das gleiche Projekt.

    Elmar Boye hat in einem der vorherigen Threads sehr hilfreiche Vorschläge gegeben. Unter anderem auch:

    > Ein entsprechendes Vorgehen bietet sich auch für die Schriftstile und anderes mehr an.

    Ich würde gerne den nachfolgenden Code, wenn möglich, auch reduzieren bzw. professioneller gestalten und weiß leider immer noch nicht wie (Es sind sechzig Label).

    private void label1_Click(object sender, EventArgs e)

            {

                if (checkBox1.Checked == true)

                {

                    richTextBox1.SelectionBackColor = label1.ForeColor;

                    if (checkBox2.Checked == true)

                    {

                        richTextBox1.SelectionBackColor = SystemColors.Window;

                    }

                }

                else

                {

                    richTextBox1.SelectionColor = label1.ForeColor;

                    fontnameTextBox.ForeColor = richTextBox1.SelectionColor;

                    if (checkBox2.Checked == true)

                    {

                        richTextBox1.SelectionColor = SystemColors.WindowText;

                        fontnameTextBox.ForeColor = richTextBox1.SelectionColor;

                    }

                }

                fontnameTextBox.ForeColor = label1.ForeColor;

            }

            private void label1_MouseHover(object sender, EventArgs e)

            {

                label1.BackColor = Color.DarkRed;

                colorInfoLabel.Text = label1.BackColor.ToString() + "    " + label1.BackColor.Name.ToString();

            }

            private void label1_MouseLeave(object sender, EventArgs e)

            {

                label1.BackColor = SystemColors.Control;

            }

    Die zweite Frage:

    Ist es möglich SelectionBackColor umzuschreiben, damit die Hintergrundfarben auch in Word richtig angezeigt werden.

     

    RTF-Datei:

        in Word:

                   

      Viele Grüße

        Christina

    Donnerstag, 17. Mai 2012 21:05

Antworten

  • Hallo Christina,

    um mit den Farben das gleiche wie mit den Schriftgrößen zu machen, also ein EventHandler für alle,
    kannst Du die Information zur Farbe aus dem Steuerelement abrufen - bei Dir wohl Label.ForeColor:

            private void fontcolorLabel_Click(object sender, EventArgs e)
            {
                Label colorLabel = (Label)sender;
                Color selectionColor = colorLabel.ForeColor;
                fontnameTextBox.ForeColor = selectionColor;
                
                if (checkBox1.Checked)  // Hintergrundfarbe (mögliche Benamsung: backColorCheckBox)
                {
                    if (checkBox2.Checked)  // Rückgängig (undoColorCheckBox)
                    {
                        richTextBox1.SelectionBackColor = SystemColors.Window;
                    }
                    else
                    {
                        richTextBox1.SelectionBackColor = selectionColor;
                    }
                }
                else // Vordergrundfarbe
                {
                    if (checkBox2.Checked)
                    {
                        richTextBox1.SelectionColor = SystemColors.WindowText;
                    }
                    else
                    {
                        richTextBox1.SelectionColor = selectionColor;
                    }
                }
            }

    Äquivalent für die andere Ereignisse.

    Was das abweichende Verhalten von Word angeht, habe ich im Moment keine Gelegenheit zum Testen.

    "Professioneller" wäre auf die vielen Label zu verzichten, die doch etwas Ressourcen fressen.
    Dazu müsste man sich ein UserControl schreiben, dass die Farben direkt zeichnet und anhand der Mausposition auswählt.
    Das wäre jedoch ein größeres Unterfangen. Ein Beispiel wäre z. B. http://www.codeproject.com/Articles/12327/Office-2003-Color-Picker

    Gruß Elmar

    Freitag, 18. Mai 2012 08:17
    Beantworter
  • Hallo Christina,

    was den Zugriff auf externe Formulare angeht:
    Man kann durchaus darauf zugreifen, wobei man das, was extern zugänglich sein soll -
    hier die aktuell ausgewählte Farbe -, als öffentliche Eigenschaft bereit stellen würde.

    Wobei es davon abhängt wie Du das Formular bereitstellen willst.
    Eine Möglichkeit wäre ein Dialog wie der ColorDialog, der ähnliche Aufgaben wahrnimmt.

    Eine weitere ein Tool Window - wie sie auch Visual Studio verwendet - und Deines eher danach aussieht.
    Damit davon nur eine Instanz existiert, würde man eine öffentliche statische Eigenschaft verwenden.

    Ein grob skizzierter Entwurf - wobei ich die Farbauswahl als Doppelklick nur simuliert habe:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace ElmarBoye.Samples.Forms
    {
        public partial class ColorChooseForm : Form
        {
            private static ColorChooseForm __instance;
            private Color _selectedColor = Color.Transparent;
    
            /// <summary>Privater Konstruktor, Zugriff nur über Instance Eigenschaft.</summary>
            private ColorChooseForm()
            {
                InitializeComponent();
                // oder SizableToolWindow
                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
                this.MaximizeBox = false;
                this.MinimizeBox = false;
            }
    
            /// <summary>
            /// Stellt die einzige Instanz des Formulars bereit
            /// </summary>
            public static ColorChooseForm Instance
            {
                get
                {
                    if (__instance == null || __instance.IsDisposed)
                    {
                        __instance = new ColorChooseForm();
                        __instance.Show();
                    }
                    return __instance;
                }
            }
    
            /// <summary>Zeigt das Formular an.</summary>
            public void ShowForm()
            {
                this.Visible = true;
            }
    
            /// <summary>Verbirgt das Formular.</summary>
            public void HideForm()
            {
                this.Visible = false;
            }
    
            /// <summary>Liefert oder setzt die aktuell ausgewählte Farbe.</summary>
            public Color SelectedColor
            {
                get { return this._selectedColor; }
                set
                {
                    if (this._selectedColor != value)
                    {
                        this._selectedColor = value;
                        this.OnSelectedColorChanged(new SelectedColorChangedEventArgs(value));
                    }
                }
            }
    
            /// <summary>Löst das SelectedColorChanged Ereignis aus.</summary>
            /// <param name="e"></param>
            protected virtual void OnSelectedColorChanged(SelectedColorChangedEventArgs e)
            {
                var handler = this.SelectedColorChanged;
                if (handler != null)
                    handler(this, e);
            }
    
            /// <summary>Ereignis, das beim Wechsel der Farbauswahl ausgelöst wird.</summary>
            public event EventHandler<SelectedColorChangedEventArgs> SelectedColorChanged;
    
            protected override void OnFormClosing(FormClosingEventArgs e)
            {
                // Versteckt das Formular wenn es vom Benutzer geschlossen wird
                if (e.CloseReason == CloseReason.UserClosing)
                {
                    e.Cancel = true;
                    HideForm();
                }
                base.OnFormClosing(e);
            }
    
            protected override void OnFormClosed(FormClosedEventArgs e)
            {
                __instance = null;
                base.OnFormClosed(e);
            }
    
            /// <summary>
            ///  Dummy für Farbauswahl ...
            /// </summary>
            private void ColorChooseForm_MouseDoubleClick(object sender, MouseEventArgs e)
            {
                this.SelectedColor = Color.FromArgb(e.X % 255, e.Y % 255, 0);
            }
        }
    
        /// <summary>Ereignisargumente für das SelectedColorChanged Ereignis.</summary>
        public class SelectedColorChangedEventArgs : EventArgs
        {
            private Color _color;
            
            public SelectedColorChangedEventArgs(Color color)
            {
                this._color = color;
            }
    
            public Color Color
            {
                get { return this._color; }
            }
        }
    }
    

    Und zu verwenden z. B. so:

        private void MainForm_Load(object sender, EventArgs e)
        {
            ColorChooseForm.Instance.SelectedColorChanged += ColorChooseForm_SelectedColorChanged;
        }
    
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            ColorChooseForm.Instance.SelectedColorChanged -= ColorChooseForm_SelectedColorChanged;
        }
    
        void ColorChooseForm_SelectedColorChanged(object sender, SelectedColorChangedEventArgs e)
        {
            Console.WriteLine("Color Changed: {0}", e.Color);
            this.richTextBox1.SelectionColor = e.Color;
        }

    Einige weitere Dinge, wie z. B. das Speichern der Fensterposition  usw. kämen optional hinzu.

    Gruß Elmar

    Dienstag, 22. Mai 2012 10:31
    Beantworter

Alle Antworten

  • Hallo Christina,

    um mit den Farben das gleiche wie mit den Schriftgrößen zu machen, also ein EventHandler für alle,
    kannst Du die Information zur Farbe aus dem Steuerelement abrufen - bei Dir wohl Label.ForeColor:

            private void fontcolorLabel_Click(object sender, EventArgs e)
            {
                Label colorLabel = (Label)sender;
                Color selectionColor = colorLabel.ForeColor;
                fontnameTextBox.ForeColor = selectionColor;
                
                if (checkBox1.Checked)  // Hintergrundfarbe (mögliche Benamsung: backColorCheckBox)
                {
                    if (checkBox2.Checked)  // Rückgängig (undoColorCheckBox)
                    {
                        richTextBox1.SelectionBackColor = SystemColors.Window;
                    }
                    else
                    {
                        richTextBox1.SelectionBackColor = selectionColor;
                    }
                }
                else // Vordergrundfarbe
                {
                    if (checkBox2.Checked)
                    {
                        richTextBox1.SelectionColor = SystemColors.WindowText;
                    }
                    else
                    {
                        richTextBox1.SelectionColor = selectionColor;
                    }
                }
            }

    Äquivalent für die andere Ereignisse.

    Was das abweichende Verhalten von Word angeht, habe ich im Moment keine Gelegenheit zum Testen.

    "Professioneller" wäre auf die vielen Label zu verzichten, die doch etwas Ressourcen fressen.
    Dazu müsste man sich ein UserControl schreiben, dass die Farben direkt zeichnet und anhand der Mausposition auswählt.
    Das wäre jedoch ein größeres Unterfangen. Ein Beispiel wäre z. B. http://www.codeproject.com/Articles/12327/Office-2003-Color-Picker

    Gruß Elmar

    Freitag, 18. Mai 2012 08:17
    Beantworter
  • Hallo Elmar

    Danke für die Antwort und den Code.

    > Dazu müsste man sich ein UserControl schreiben, dass die Farben direkt zeichnet und anhand der Mausposition auswählt.

    Ich werde den Link am Abend nochmal genauer ansehen und es so versuchen.

    Änderungen im Projekt:

      echoTextBox              (geändert)

      Wörter finden            (geändert)

      Bild einfügen             (geändert)

      comboBox2               (Schrifteinzug – Ausgewählte Zeile – stufenweise)

      textPositionButton    (Center – Left (gesamter Text))

      trackBar                     (Zoom (gesamter Text))

      Text in Sprache          (ScanSoftSteffi funktioniert noch auf diesem PC)

    Noch nicht geändert:

      Drucken und Druckvorschau

    Nochmal vielen Dank und viele Grüße

    Christina

    Freitag, 18. Mai 2012 09:54
  • Hallo

    Entschuldigung wegen der späten Rückmeldung, hatte leider noch nicht viel Zeit ….

    Ich habe ein neues Testprojekt erstellt  (RichTextBox, MenuStrip, CheckBox, Label, Form2)

    In einigen Tutorials habe ich gelesen, das Form2 nicht direkt auf Form1 zugreifen soll.

    Es gelingt aber trotz einiger Versuche auch nicht  eine Verbindung zwischen RichTextBox (Form1) und Form2 (ColorPalette) herzustellen.

    Eine danach eingefügte PictureBox - Visible true/false  (Screenshot von Form2) funktioniert wie gewünscht, ist aber optisch noch schlimmer wie das Panel mit den ColorLabels(VS_Editor1)).

    Testprojekt:

                                                                        Links: Form2                         Rechts: PictureBox

    Wenn es möglich ist, einige Funktionen in neue Forms einzubinden  könnte die Oberfläche von VS_Editor neu überarbeitet werden, ansonsten werde ich den Code von Elmar Boye verwenden.

    Viele Grüße

    Christina



    • Bearbeitet ch.f.1 Sonntag, 20. Mai 2012 17:30
    Sonntag, 20. Mai 2012 17:16
  • Hallo Christina,

    was den Zugriff auf externe Formulare angeht:
    Man kann durchaus darauf zugreifen, wobei man das, was extern zugänglich sein soll -
    hier die aktuell ausgewählte Farbe -, als öffentliche Eigenschaft bereit stellen würde.

    Wobei es davon abhängt wie Du das Formular bereitstellen willst.
    Eine Möglichkeit wäre ein Dialog wie der ColorDialog, der ähnliche Aufgaben wahrnimmt.

    Eine weitere ein Tool Window - wie sie auch Visual Studio verwendet - und Deines eher danach aussieht.
    Damit davon nur eine Instanz existiert, würde man eine öffentliche statische Eigenschaft verwenden.

    Ein grob skizzierter Entwurf - wobei ich die Farbauswahl als Doppelklick nur simuliert habe:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace ElmarBoye.Samples.Forms
    {
        public partial class ColorChooseForm : Form
        {
            private static ColorChooseForm __instance;
            private Color _selectedColor = Color.Transparent;
    
            /// <summary>Privater Konstruktor, Zugriff nur über Instance Eigenschaft.</summary>
            private ColorChooseForm()
            {
                InitializeComponent();
                // oder SizableToolWindow
                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
                this.MaximizeBox = false;
                this.MinimizeBox = false;
            }
    
            /// <summary>
            /// Stellt die einzige Instanz des Formulars bereit
            /// </summary>
            public static ColorChooseForm Instance
            {
                get
                {
                    if (__instance == null || __instance.IsDisposed)
                    {
                        __instance = new ColorChooseForm();
                        __instance.Show();
                    }
                    return __instance;
                }
            }
    
            /// <summary>Zeigt das Formular an.</summary>
            public void ShowForm()
            {
                this.Visible = true;
            }
    
            /// <summary>Verbirgt das Formular.</summary>
            public void HideForm()
            {
                this.Visible = false;
            }
    
            /// <summary>Liefert oder setzt die aktuell ausgewählte Farbe.</summary>
            public Color SelectedColor
            {
                get { return this._selectedColor; }
                set
                {
                    if (this._selectedColor != value)
                    {
                        this._selectedColor = value;
                        this.OnSelectedColorChanged(new SelectedColorChangedEventArgs(value));
                    }
                }
            }
    
            /// <summary>Löst das SelectedColorChanged Ereignis aus.</summary>
            /// <param name="e"></param>
            protected virtual void OnSelectedColorChanged(SelectedColorChangedEventArgs e)
            {
                var handler = this.SelectedColorChanged;
                if (handler != null)
                    handler(this, e);
            }
    
            /// <summary>Ereignis, das beim Wechsel der Farbauswahl ausgelöst wird.</summary>
            public event EventHandler<SelectedColorChangedEventArgs> SelectedColorChanged;
    
            protected override void OnFormClosing(FormClosingEventArgs e)
            {
                // Versteckt das Formular wenn es vom Benutzer geschlossen wird
                if (e.CloseReason == CloseReason.UserClosing)
                {
                    e.Cancel = true;
                    HideForm();
                }
                base.OnFormClosing(e);
            }
    
            protected override void OnFormClosed(FormClosedEventArgs e)
            {
                __instance = null;
                base.OnFormClosed(e);
            }
    
            /// <summary>
            ///  Dummy für Farbauswahl ...
            /// </summary>
            private void ColorChooseForm_MouseDoubleClick(object sender, MouseEventArgs e)
            {
                this.SelectedColor = Color.FromArgb(e.X % 255, e.Y % 255, 0);
            }
        }
    
        /// <summary>Ereignisargumente für das SelectedColorChanged Ereignis.</summary>
        public class SelectedColorChangedEventArgs : EventArgs
        {
            private Color _color;
            
            public SelectedColorChangedEventArgs(Color color)
            {
                this._color = color;
            }
    
            public Color Color
            {
                get { return this._color; }
            }
        }
    }
    

    Und zu verwenden z. B. so:

        private void MainForm_Load(object sender, EventArgs e)
        {
            ColorChooseForm.Instance.SelectedColorChanged += ColorChooseForm_SelectedColorChanged;
        }
    
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            ColorChooseForm.Instance.SelectedColorChanged -= ColorChooseForm_SelectedColorChanged;
        }
    
        void ColorChooseForm_SelectedColorChanged(object sender, SelectedColorChangedEventArgs e)
        {
            Console.WriteLine("Color Changed: {0}", e.Color);
            this.richTextBox1.SelectionColor = e.Color;
        }

    Einige weitere Dinge, wie z. B. das Speichern der Fensterposition  usw. kämen optional hinzu.

    Gruß Elmar

    Dienstag, 22. Mai 2012 10:31
    Beantworter
  • Hallo ch.f.1,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 25. Mai 2012 12:44
    Besitzer
  • Hallo Robert

    Kann erst zum Wochenende mit VisualStudio2010 weiterarbeiten.

    Ich hoffe es gelingt, den Code von Elmar Boye richtig zu verwenden.

    Habe bis jetzt versucht: Den Code anzupassen und eintragen. Ist nicht ganz gelungen.

    Leider ist mein Wissen noch zu gering, um mit Form2 oder Form3 die selektierte Textfarbe von richTextBox1 zu ändern.   VS_Editor1 wird wieder aktuell, wenn ich diese Lücken gefüllt habe.

    Vielen Dank für die bisherige großartige Hilfe und vor allem vielen Dank an Elmar Boye.

    Viele Grüße

         Christina


    • Bearbeitet ch.f.1 Freitag, 1. Juni 2012 09:25 Link entfernt
    Freitag, 25. Mai 2012 17:31