2010-08-02 84 views
5

由於無法解決問題(原始here),我正在重新發布此問題。MouseLeave事件在控件的滾動條上移動時觸發

在TreeView,ListBox中,或者它似乎從我的谷歌搜索任何與ScrollBar,ScrollBar不被視爲控件的一部分。

我有一個TreeView,我把它放在一個自定義控件中,它是Dock填充。所以它就像一個自定義的TreeView一樣,它擁有我們所有的邏輯來管理它。

在我們的程序的某些部分,我們根據MouseEnter事件將其滑出,然後將其滑回到MouseLeave事件中,但是我們目前正在使用第三方庫的TreeView來執行此操作,因此我一直負責進行替換。

所以我把所有的東西都移到了Windows的TreeView中,但是找不到一個方法來可靠地捕獲MouseLeave - 只有它離開了整個TreeView,包含了滾動條。

我已經看到了一個黑客解決方案,將它包裝在一個具有幾個像素的面板中,並捕獲面板的MouseLeave,但我幾乎不相信這是微軟在這種情況下打算做的。

在短:

的滾動條不火的MouseEnter或鼠標離開的控制,這使得使用的MouseEnter /鼠標離開滑動了控制,因爲用戶無法使用滾動條無法使用。

處理這種情況的首選方法是什麼?

在上一個問題中,我得到了使用Spy ++的建議,並試圖附加到WndProc()來處理ScrollBar的MouseEnter/MouseLeave。

但是,這並沒有工作,因爲Spy ++顯示的消息沒有在WndProc()的窗體級別或控件級別觸發。就好像.NET不能看到ScrollBar一樣。使用WndProc()對於這樣一個簡單的請求似乎也是不切實際的,是否有任何其他方式來做到這一點,或者如果WndProc()是唯一的方法,有沒有人真的能夠實現這一點,並告訴我怎麼做?

回答

4

對此沒有乾淨的解決方案。您的面板技巧也無法使用,當用戶快速移動鼠標時,它將完全錯過。

平底船。一旦你得到MouseEnter,啓動一個200毫秒的計時器。在Tick事件中,檢查鼠標是否仍然懸停在樹形視圖上。例如:

private void treeView1_MouseEnter(object sender, EventArgs e) { 
     timer1.Enabled = true; 
     treeView1.Width = 220; 
    } 

    private void timer1_Tick(object sender, EventArgs e) { 
     Point pos = treeView1.PointToClient(Cursor.Position); 
     if (!treeView1.DisplayRectangle.Contains(pos)) { 
      timer1.Enabled = false; 
      treeView1.Width = 50; 
     } 
    } 

Application.Idle事件的工作原理也是順便說一句,稍微有些尷尬。

+0

這工作完美,謝謝! – 2011-01-11 19:16:48

2

感謝提示有同樣的問題,我修改了timer_Tick事件,以包括滾動條通過添加20的寬度。

private void tmrListPos_Tick(object sender, EventArgs e) 
    { 
     Point posLB = clbPlants.PointToClient(Cursor.Position); 
     Rectangle rectPlants = clbPlants.DisplayRectangle; 
     rectPlants.Width = rectPlants.Size.Width + 20; 
     if (!rectPlants.Contains(posLB)) 
     { 
      tmrListPos.Enabled = false; 
      clbPlants.Size = clbPlants.MinimumSize; 
     } 
    } 
相關問題