Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Elegante lösung 2 RichTextBoxen syncron zu scrollen
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

Elegante lösung 2 RichTextBoxen syncron zu scrollen

beantworten | zitieren | melden

Beschreibung:

Also kurz und knapp:
Ich hatte jetzt das Problem 2 Rtb`s synchron scrollen zu lassen. Nach langem lesen im Internet hab ich jetzt eine lösung "ausgearbeitet" die mir persönlich sehr gut gefällt und ich diese euch nicht vorenthalten wollte .

Vielleicht kanns ja jemand gebrauchen .


using System.Runtime.InteropServices;
....
        #region globals
        private const int WM_VSCROLL = 277; // Vertikal Scroll
        private const int SB_LINEUP = 0; // Scrollt eine zeile hoch
        private const int SB_LINEDOWN = 1; // Scrollt eine zeile runter
        #endregion

        #region dllImport
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
        [DllImport("User32.dll")]
        public extern static int GetScrollPos(IntPtr hWnd, int nBar);
        [DllImport("User32.dll")]
        public extern static int SetScrollPos(IntPtr hWnd, int nBar,int nPos, bool bReddraw);
        #endregion
        #region event
        void richTextBox1_VScroll(object sender, System.EventArgs e)
        {
            int scrollPosRtb1 = GetScrollPos(richTextBox1.Handle, 1);
            int scrollPosRtb2 = GetScrollPos(richTextBox2.Handle, 1);
            if (scrollPosRtb1 == scrollPosRtb2)
            {
                return;
            }
            if (scrollPosRtb1 > scrollPosRtb2)
            {
                SendMessage(richTextBox2.Handle, WM_VSCROLL, (IntPtr)SB_LINEDOWN, IntPtr.Zero);
            }
            else
            {
                SendMessage(richTextBox2.Handle, WM_VSCROLL, (IntPtr)SB_LINEUP, IntPtr.Zero);
            }

            SetScrollPos(richTextBox2.Handle, 1, scrollPosRtb1, true);

        }
        #endregion
//Edit:
Es hatte doch noch nicht 100%ig funktioniert. Sollte es jetzt aber tun

Schlagwörter: richtextbox, scroll, synchron,vscroll
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Kalleberlin am .
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
el_panter
myCSharp.de - Member



Dabei seit:
Beiträge: 395
Herkunft: Sömmerda

beantworten | zitieren | melden

also erstmal danke für das snippet...

nur leider werden wir (ich und das schnipsel da) keine freunde.
das mit dem scrollen klappt noch nicht so recht:
scrolle ich in rtb1
rtb1 = 3 zeilen runter
rtb2 = 12 zeilen runter

bewege ich den scrolbalken mit der maus
rtb1 = alles io
rtb2 = 3 zeilen in die entsprchende richtung

/EDIT:
vlt noch sinvoll zu wissen
gehe ich per pfeiltasten zeile für zeile durch klapt alles
scheint also ein problem der scrolleigenschaften zu sein
(also das was ich unter systemeingeschaften -> maus -> schrollgeschwindigkeit einstelle)

also es scrollt zumindest mit nur nicht richtig xD
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von el_panter am .
MfG Paul
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Hallo el_panter,

als ich das benutzt habe, bin ich davon ausgegangen das der Inhalt beider rtb's genauso viele Zeilen hat.

Ich denke mal das das bei dir nich so ist.

Versuch mal die ScrollPos nur zu setzen wenn LINEUP oder LINEDOWN zutrifft.

Mehr fällt mir gerade nicht ein
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
el_panter
myCSharp.de - Member



Dabei seit:
Beiträge: 395
Herkunft: Sömmerda

beantworten | zitieren | melden

doch die zeilen sind gleich. (beide seiten mit exakt 3256 zeilen)

aber egal. war jetzt nicht so wichtig

trotzdem danke
MfG Paul
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Mhh also ich habe teilweise sogar noch mehr zeilen, bei mir geht das tadellos
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
fadass
myCSharp.de - Member



Dabei seit:
Beiträge: 101

beantworten | zitieren | melden

sry wenn ich frage, aber wäre es nicht einfacher die WM's die das eine Control empfängt an das andere Control weiter zu schicken??
private Nachricht | Beiträge des Benutzers
TheBrainiac
myCSharp.de - Member

Avatar #avatar-3152.png


Dabei seit:
Beiträge: 795
Herkunft: /dev/null

beantworten | zitieren | melden

Eigentlich schon.

Aber angenommen, RichtextBox1 (rtb1) ist auf Zeile 12 gescrollt und RichtextBox2 (rtb2) auf Zeile 1. Sendet man dann die gleichen WM's (WM_VSCROLL und SB_LINEDOWN), dann ist rtb1 auf 13 und rtb2 auf 2 o.Ä.

Der Code oben stellt sicher, dass sie nach dem Scrollen gleich sind.

Gruß, Christian.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von TheBrainiac am .
There are 10 types of people in the world:
Those, who think they understand the binary system
Those who don't even have heard about it
And those who understand "Every base is base 10"
private Nachricht | Beiträge des Benutzers