2015-01-28 4 views
2

Я хочу создать текстовое поле с индексом каждой строки в отдельном ящике рядом с самим собой. Все почти выполнено, но прокрутка по-прежнему является проблемой для меня. Когда я использую WndProc для управления прокруткой, WM_VSCROLL работает очень хорошо и одновременно выполняет прокрутку управления, но когда я хочу отправить WM_MOUSEWHEEL через List-box, это не сработает. Я думал, что могу использовать трюк и повторять WM_VSCROLL, когда пользователь перемещает колесико мыши но это тоже не работает.Как синхронизировать прокрутку текстового поля и списка

private const int WM_VSCROLL = 0x115; 
    private const int WM_MOUSEWHEEL = 0x20A; 
    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m);    
     if (m.Msg == WM_VSCROLL) 
     { 
      Message newMessage = Message.Create(Sequence.Handle, m.Msg, m.WParam, m.LParam); 
      Sequence.DirectMessage(newMessage);//turn to thread 
     } 
     else if(m.Msg == WM_MOUSEWHEEL) 
     { 
      if((int)m.WParam<0) 
      { 

       Message newMessage = Message.Create(Sequence.Handle, WM_VSCROLL,(IntPtr)1,(IntPtr) 0); 
       Message newMessage2 = Message.Create(this.Handle, WM_VSCROLL, (IntPtr)1, (IntPtr)0);      
       Sequence.DirectMessage(newMessage); 
       base.WndProc(ref newMessage2); 
      } 
      else 
      { 
       Message newMessage = Message.Create(Sequence.Handle, WM_VSCROLL, (IntPtr)0, (IntPtr)0); 
       Message newMessage2 = Message.Create(this.Handle, WM_VSCROLL, (IntPtr)0, (IntPtr)0); 
       Sequence.DirectMessage(newMessage); 
       base.WndProc(ref newMessage2); 
      } 
     } 
    } 

Sequence это имя моего списка коробки и this выводит на мой textbox.I был бы признателен за любую помощь ....

ответ

0

Сделайте то же самое, как WM_SCROLL:

[DllImport("user32.dll", EntryPoint = "SendMessage")] 
internal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam); 

private const int WM_VSCROLL = 0x115; 
private const int WM_MOUSEWHEEL = 0x20A; 

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == WM_VSCROLL || m.Msg == WM_MOUSEWHEEL) 
    { 
     SendMessage(Sequence.Handle, (UInt32)m.Msg, m.WParam, m.LParam); 
    } 

    base.WndProc(ref m); 
} 
Смежные вопросы