Laden...

Elegante lösung 2 RichTextBoxen syncron zu scrollen

Erstellt von Kalleberlin vor 16 Jahren Letzter Beitrag vor 16 Jahren 6.008 Views
K
Kalleberlin Themenstarter:in
165 Beiträge seit 2007
vor 16 Jahren
Elegante lösung 2 RichTextBoxen syncron zu scrollen

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

If u want to finish first, u have to finish first.
E
395 Beiträge seit 2007
vor 16 Jahren

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

MfG Paul

K
Kalleberlin Themenstarter:in
165 Beiträge seit 2007
vor 16 Jahren

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.
E
395 Beiträge seit 2007
vor 16 Jahren

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

aber egal. war jetzt nicht so wichtig

trotzdem danke

MfG Paul

K
Kalleberlin Themenstarter:in
165 Beiträge seit 2007
vor 16 Jahren

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.
F
101 Beiträge seit 2007
vor 16 Jahren

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??

795 Beiträge seit 2006
vor 16 Jahren

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.

`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"`