2015-04-21 57 views
0

我有一個程序,其中有一個FlowLayoutPanel其窗體。我正在編碼FlowLayoutPanelMouseMove事件和一切工作正常;除非光標在其滾動條上移動時不觸發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); 
     } 
    } 

我有養育(或調用)問題base.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屬性。 順便說一句,OnNcMouseMove做什麼? –

+0

將屏幕轉換爲窗口座標進行更新。 OnNcMouseMove將是此消息的正常收件人。 – Alex

+0

@RamtinSoltani爲你做了這個更新工作? – Alex

相關問題