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
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
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 😜
doch die zeilen sind gleich. (beide seiten mit exakt 3256 zeilen)
aber egal. war jetzt nicht so wichtig
trotzdem danke
MfG Paul
Mhh also ich habe teilweise sogar noch mehr zeilen, bei mir geht das tadellos 🤔
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??
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.