2015-04-21 1 views
0

У меня есть программа, которая имеет FlowLayoutPanel внутри его формы. Я кодирую на FlowLayoutPanelСобытие MouseMove и все работает нормально; за исключением того, что он не запускает событие MouseMove, пока курсор перемещается по его полосе прокрутки.Как передать MouseEventArgs с правильными свойствами в обработчики событий?

Я искал в Интернете и нашел следующий подход, который использует производный класс от FlowLayoutPanel, а затем отменяет его WndProc метод:

class FlowLayoutPanelEx : FlowLayoutPanel 
    { 
     const int WM_NCMOUSEMOVE = 0x00A0; 

     protected override void WndProc(ref Message m) 
     { 
      if (m.Msg == WM_NCMOUSEMOVE) 
      { 
       base.OnMouseMove(null); 
      } 

      base.WndProc(ref m); 
     } 
    } 

У меня проблема с повышением (или вызова) основа.OnMouseMove(). Для этого необходимо указать объект MouseEventArgs. Мне нужно передать правильный MouseEventArgs, потому что мой обработчик событий полагается на него, но я не знаю, как установить/где получить правильные свойства (кнопки, X, Y и т. Д.), Чтобы передать правильные MouseMoveEvent ,

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

ответ

1

Вы можете обнаружить перемещение мыши по полосе прокрутки путем перехвата сообщения WM_NCMOUSEMOVE. Как это:

protected override void WndProc(ref Message m) { 
    if (m.Msg == 0xA0) { // WM_NCMOUSEMOVE. 
     var pos = this.PointToClient(new Point(m.LParam.ToInt32())); 
     var evt = new MouseEventArgs(Control.MouseButtons, 0, pos.X, pos.Y, 0); 
     OnMouseMove(evt); 
    } 
    base.WndProc(ref m); 
} 
+0

Есть две проблемы с кодом вы предоставили: Во-первых, X и Y значения являются позиции указателя на весь экран, а не на пользовательском элементе управления. Мне нужна координата указателя только на пользовательском контроле, и я не могу выполнять операции над X и Y, переданные в обработчике событий. Во-вторых, мне нужно свойство MouseButtons. BTW, что делает OnNcMouseMove делать? –

+0

Обновления с переводом экрана на окна. OnNcMouseMove будет обычным получателем этого сообщения. – Alex

+0

@ RamtinSoltani это обновление работает для вас? – Alex