2010-08-02 32 views
5

Tôi đang reposting câu hỏi này do không có khả năng giải quyết vấn đề (gốc here).Sự kiện MouseLeave kích hoạt khi di chuyển qua ScrollBar của điều khiển

Trong TreeView, ListBox hoặc dường như từ tìm kiếm google của tôi bất kỳ thứ gì có ScrollBar, ScrollBar không được coi là một phần của điều khiển.

Tôi có TreeView mà tôi đang đặt vào kiểm soát tùy chỉnh và đó là Dock Fill. Vì vậy, có nó hoạt động như một TreeView tùy chỉnh mà có tất cả logic của chúng tôi để quản lý nó ở một nơi.

Trong các phần của chương trình, chúng tôi trượt nó ra dựa trên sự kiện MouseEnter, và trượt nó trở lại trong một sự kiện MouseLeave, tuy nhiên chúng tôi hiện đang sử dụng TreeView của thư viện thứ 3 cho điều này, mà tôi đã được giao nhiệm vụ thay thế.

Vì vậy, tôi đã di chuyển mọi thứ sang Windows TreeView, nhưng không thể tìm thấy cách đáng tin cậy để nắm bắt MouseLeave -only- nếu nó rời khỏi toàn bộ TreeView, bao gồm thanh cuộn.

Tôi đã nhìn thấy một giải pháp hackish gói nó trong một bảng điều khiển với một vài điểm ảnh và chụp MouseLeave của bảng điều khiển, nhưng tôi khó tin rằng đây là những gì Microsoft đã dự định chúng tôi làm trong tình huống này.

Trong ngắn:

Các ScrollBar không cháy MouseEnter hoặc MouseLeave cho sự kiểm soát, và điều đó làm cho việc sử MouseEnter/MouseLeave cho trượt ra khỏi sự kiểm soát không sử dụng được vì người dùng không thể sử dụng ScrollBar.

Cách ưa thích để xử lý tình huống này là gì?

Trong câu hỏi trước, tôi đã đưa ra lời khuyên để sử dụng Spy ++ và cố gắng đính kèm vào WndProc() để xử lý MouseEnter/MouseLeave cho ScrollBar.

Tuy nhiên, điều này không hoạt động như các tin nhắn mà Spy ++ đã trình bày không kích hoạt trong WndProc() ở cấp biểu mẫu hoặc cấp điều khiển. Nó như thể .NET không thể thấy ScrollBar.

Sử dụng WndProc() cũng có vẻ không thực tế với yêu cầu đơn giản như vậy, có cách nào khác để làm điều này không, hoặc nếu WndProc() là cách duy nhất, có ai thực sự có thể đạt được điều này không?

Trả lời

4

Không có giải pháp sạch nào cho việc này. Mẹo trên bảng điều khiển của bạn không hoạt động, nó sẽ bị mất hoàn toàn khi người dùng di chuyển chuột nhanh chóng.

Punt. Một khi bạn nhận được MouseEnter, bắt đầu một bộ đếm thời gian 200 msec. Trong sự kiện Tick, kiểm tra xem con chuột vẫn đang lơ lửng trên cây xem. Ví dụ:

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; 
     } 
    } 

Sự kiện Application.Idle hoạt động quá btw, chỉ hơi khó xử hơn một chút.

+0

Điều này làm việc hoàn hảo, cảm ơn bạn! –

2

Cảm ơn Tip đã gặp vấn đề tương tự, tôi đã sửa đổi sự kiện timer_Tick để bao gồm thanh cuộn bằng cách thêm 20 vào chiều rộng.

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; 
     } 
    } 
Các vấn đề liên quan