Прокручивая два текстовых поля вместе, я не могу понять это

Я хочу прокручивать timeBox вверх, когда я прокручиваю chatBox вверх. (не обязательно наоборот)

Я нашел следующий код для этого:

/// Subclass RichTextBox to add the capability to bind scrolling for multiple RichTextBoxs.
/// This is useful for 'parallel' RTBs that require synchronized scrolling.
/// Taken from https://gist.github.com/593809
/// Added WM_HSCROLL 
/// Added BindScroll() to form a two-way linkage between RichTextBoxes.
/// Example usage showing how to bind 3 RichTextBoxes together:
/// rtb1.BindScroll(rtb2);
/// rtb2.BindScroll(rtb3);
/// rtb3.BindScroll(rtb1);

class RichTextBoxSynchronizedScroll : RichTextBox
{

    private const int WM_VSCROLL = 0x115;
    private const int WM_HSCROLL = 0x114;

    private List<RichTextBoxSynchronizedScroll> peers = new List<RichTextBoxSynchronizedScroll>();

    /// <summary>
    /// Establish a 2-way binding between RTBs for scrolling.
    /// </summary>
    /// <param name="arg">Another RTB</param>
    public void BindScroll( RichTextBoxSynchronizedScroll arg )
    {
        if ( peers.Contains( arg ) || arg==this ) { return; }
        peers.Add( arg );
        arg.BindScroll(this);
    }

    private void DirectWndProc(ref Message m)
    {
        base.WndProc(ref m);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_VSCROLL || m.Msg == WM_HSCROLL )
        {
            foreach (RichTextBoxSynchronizedScroll peer in this.peers)
            {
                Message peerMessage = Message.Create(peer.Handle, m.Msg, m.WParam, m.LParam);
                peer.DirectWndProc(ref peerMessage);
            }
        }

        base.WndProc(ref m);
    }
}

Тем не менее, я ломал голову над этим более 2 часов, пытаясь заставить работать разные коды, но я не могу заставить ни один из них работать, так как я только относительно только начал программировать, и Не могу понять, что делать с этим кодом.

Я пытался поместить его как дополнительный класс в код моей формы, но тогда я не мог применить BindScroll() к любому текстовому полю, так как не мог ссылаться на них или экземпляр.

Может быть, я мог бы, но я не знаю, как. Я пытался использовать только код внутри класса, не будучи классом сам по себе, но это вызывало ошибки.

Любая помощь приветствуется...


person Ramzes M    schedule 30.07.2013    source источник


Ответы (2)


После тестирования вашего кода, похоже, он работает нормально. Ваша проблема может заключаться в том, что вы не знаете, как использовать код, вам нужно объявить новые форматированные текстовые поля как RichTextBoxSynchronizedScroll, а не как стандартные RichTextBox:

//Here is the test
public partial class Form1 : Form {
   public Form1(){
     InitializeComponent();
     rb1.Size = new Size(200,100);
     rb2.Size = rb1.Size;
     rb2.Left = rb1.Right + 5;
     rb1.Parent = rb2.Parent = this;
     rtb1.BindScroll(rtb2);       
     //try populating some data for both the richtextboxes
     for(int i = 0; i < 200; i++)
        rtb1.Text += Guid.NewGuid() + "\r\n";
     rtb2.Text = rtb1;
     //now try scrolling the rtb1
     //I suggest you should add WM_MOUSEWHEEL = 0x20a into the if statement
     //something like this: if (m.Msg == WM_VSCROLL || m.Msg == WM_HSCROLL || m.Msg == WM_MOUSEWHEEL) ...
   }
   RichTextBoxSynchronizedScroll rtb1 = new RichTextBoxSynchronizedScroll();
   RichTextBoxSynchronizedScroll rtb2 = new RichTextBoxSynchronizedScroll();
}
//That's all
person King King    schedule 30.07.2013
comment
Спасибо за ваш ответ, и я изменил код. Но проблема в том, что я буквально не знаю, куда поместить код в моей программе и как использовать BindScroll() в моих RichTextBox... - person Ramzes M; 30.07.2013
comment
@RamzesM: поместите класс RichTextBoxSynchronizedScroll в новый файл. Скомпилировать. Затем этот новый элемент управления появится на панели инструментов (где находятся другие элементы управления). Вы можете перетащить этот элемент управления на форму точно так же, как вы делали это с элементом RichTextBox. Единственное, что вам нужно сделать в форме, это вызвать BindScroll в конструкторе формы: public Form1(){ InitializeComponent(); rtb1.BindScroll(rtb2); }, где вы должны указать настоящие имена синхронизированных форматированных текстовых полей вместо rtb1 и rtb2. Код @KingKing — это всего лишь тестовая установка. - person Olivier Jacot-Descombes; 09.06.2021

Я решал это все 3 часа... и я хотел что-то очень простое. Я рассмотрел каждый аспект прокрутки. Вам просто нужно создать VScrollBar и определить событие прокрутки, подобное этому

private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
    {
        int position = text1.GetFirstCharIndexFromLine(vScrollBar1.Value);
        //position only 0.character on line
        textBox1.Select(position, 0);//if position=vScrollBar1.Value you would actually scrolling char by char
        textBox2.Select(position, 0);
        textBox1.ScrollToCaret();
        textBox2.ScrollToCaret();
    }

Надеюсь, я смогу найти это в будущем.

person Matej Skulsky    schedule 21.11.2017