C#: Синхронизировать Позицию Прокрутки двух RichTextBoxes?

Вы посмотрели Образцы MVC на CodePlex? У Rob Conery есть некоторые экранные демонстрации, которые соглашаются с созданием сайта по телефону http://blog.wekeroad.com/mvc-storefront/ .

16
задан Donut 1 December 2009 в 16:29
поделиться

2 ответа

Некоторое время назад я сделал это для небольшого проекта, и вот простое решение, которое я нашел.

Создайте новый элемент управления путем создания подкласса RichTextBox:

   public class SynchronizedScrollRichTextBox : System.Windows.Forms.RichTextBox
    {
        public event vScrollEventHandler vScroll;
        public delegate void vScrollEventHandler(System.Windows.Forms.Message message);

        public const int WM_VSCROLL = 0x115;

        protected override void WndProc(ref System.Windows.Forms.Message msg) {
            if (msg.Msg == WM_VSCROLL) {
                if (vScroll != null) {
                    vScroll(msg);
                }
            }
            base.WndProc(ref msg);
        }

        public void PubWndProc(ref System.Windows.Forms.Message msg) {
            base.WndProc(ref msg);
        }
    }     

Добавьте новый элемент управления в форму и для каждого элемента управления явным образом уведомите другие экземпляры элемента управления об изменении его положения vScroll. Примерно так:

private void scrollSyncTxtBox1_vScroll(Message msg) {
    msg.HWnd = scrollSyncTxtBox2.Handle;
    scrollSyncTxtBox2.PubWndProc(ref msg);
}

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

15
ответ дан 30 November 2019 в 16:19
поделиться

Спасибо, Джей за ответ; после еще нескольких поисков я также нашел метод, описанный здесь . Я опишу это ниже для всех, кто интересуется.


Сначала объявите следующие перечисления:

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
}

Затем добавьте внешние ссылки на GetScrollPos и 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 );

Наконец, добавьте обработчик событий для события VScroll соответствующего 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 ) );
}

В этом случае положение вертикальной прокрутки richTextBox2 будет синхронизировано с richTextBox1 .

21
ответ дан 30 November 2019 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: