2011-06-29 40 views
1

我在窗體的左側有一個ListBox。用戶可以選擇「自動隱藏」它,使其消失到左側,並且只有在用戶將鼠標移動到其上時纔會重新出現。C#ListBox.MouseEnter/MouseLeave和滾動條

如果列表框中有少量項目,這個功能可以很好地工作。

但是,只要我將足夠的項目放入列表框中,以便現在有一個滾動條,就會發生有趣的事情。只有當用戶將鼠標移動到滾動條上方的列表框中時,纔會觸發MouseEnter代碼。這意味着我必須擁有更多的滾動條的寬度,否則他們將永遠無法顯示它。

此外,如果列表框未處於焦點狀態,則用戶無法滾動。如果他們嘗試點擊滾動條滾動,ListBox消失。如果他們在列表框內單擊以將其聚焦(以便他們可以使用鼠標滾輪進行滾動),則他們將失去其選擇。

有沒有什麼辦法可以擴展MouseEnter和MouseLeave的範圍來包含滾動條?

+1

我認爲你的意思是整個滾動條,而不是進度條? –

+0

謝謝,你是對的。我還沒有喝咖啡,所以我的大腦運行在大約30% – Ozzah

回答

1

這是通過設計,滾動條不是控件客戶區的一部分。它位於非客戶區域,類似於表單頂部的標題欄。 Windows對待它們的方式不同,像WM_MOUSEMOVE這樣的鼠標移動消息會與WM_NCMOUSEMOVE一起公佈。 Winforms沒有針對非客戶端通知的事件。這是你通常想要的方式,你不想知道滾動條被操縱。功能,而不是一個錯誤。除了這種情況。

作爲一種解決方法,您可以從ListBox繼承並重寫WndProc()以查看WM_NCMOUSEMOVE消息(m.Msg == 0xa0)。或者一個200毫秒的計時器,用來檢查鼠標的位置。

+0

我接受這個答案,但我已經以不同的方式解決了這個問題,這對我的目的來說已經足夠了。 (1)當用戶進入列表框時調用Focus(),以便它們可以用鼠標滾輪滾動,並且(2)使用線程延遲隱藏框約2.5秒。 – Ozzah