C#: Synchronize Scroll Position of two RichTextBoxes?

前端 未结 5 587
失恋的感觉
失恋的感觉 2020-11-30 10:00

In my application\'s form, I have two RichTextBox objects. They will both always have the same number of lines of text. I would like to \"synchronize\" the vert

5条回答
  •  挽巷
    挽巷 (楼主)
    2020-11-30 11:03

    Thanks Jay for your answer; after some more searching I also found the method described here. I'll outline it below for anyone else interested.


    First, declare the following enums:

    public enum ScrollBarType : uint {
       SbHorz = 0,
       SbVert = 1,
       SbCtl = 2,
       SbBoth = 3
     }
    
    public enum Message : uint {
       WM_VSCROLL = 0x0115
    }
    
    public enum ScrollBarCommands : uint {
       SB_THUMBPOSITION = 4
    }
    

    Next, add external references to GetScrollPos and SendMessage.

    [DllImport( "User32.dll" )]
    public extern static int GetScrollPos( IntPtr hWnd, int nBar );
    
    [DllImport( "User32.dll" )]
    public extern static int SendMessage( IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam );
    

    Finally, add an event handler for the VScroll event of the appropriate RichTextBox:

    private void myRichTextBox1_VScroll( object sender, EventArgs e )
    {
       int nPos = GetScrollPos( richTextBox1.Handle, (int)ScrollBarType.SbVert );
       nPos <<= 16;
       uint wParam = (uint)ScrollBarCommands.SB_THUMBPOSITION | (uint)nPos;
       SendMessage( richTextBox2.Handle, (int)Message.WM_VSCROLL, new IntPtr( wParam ), new IntPtr( 0 ) );
    }
    

    In this case, richTextBox2's vertical scroll position will be synchronized with richTextBox1.

提交回复
热议问题