2010-01-06 34 views
7

Tôi có lớp con biểu mẫu có trình xử lý cho MouseHoverMouseLeave. Khi con trỏ ở trên nền của cửa sổ, các sự kiện hoạt động tốt, nhưng khi con trỏ di chuyển lên một điều khiển bên trong cửa sổ, nó gây ra sự kiện MouseLeave.MouseHover/MouseĐể lại sự kiện trên toàn bộ cửa sổ

Có cách nào để có sự kiện che phủ toàn bộ cửa sổ.

(.NET 2.0, Visual Studio 2005, Windows XP.)

Trả lời

6

Khi sự kiện rời chuột được kích hoạt, hãy kiểm tra vị trí hiện tại của con trỏ và xem nó có nằm trong vùng biểu mẫu hay không. Tôi không chắc chắn liệu có một tùy chọn tốt hơn hay không.

Chỉnh sửa: Chúng tôi có một câu hỏi tương tự mà bạn có thể quan tâm. How to detect if the mouse is inside the whole form and child controls in C#?

+0

Vì vậy, nếu tôi đăng ký xử lý tương tự cho MouseEnter và MouseLeave cho * tất cả * điều khiển bên trong một cửa sổ (bao gồm cả các tấm bên trong), sau đó có trình xử lý kiểm tra vị trí chuột để phát hiện thay đổi bên trong/bên ngoài và gọi trình xử lý nhập/rời "thực". Ý tưởng tốt, cảm ơn. – billpg

+0

Tôi đã thêm một ví dụ về cách sử dụng một sự kiện MouseEnter và MouseLeave cho toàn bộ biểu mẫu. Hãy cho tôi biết nếu điều đó phù hợp với bạn – SwDevMan81

+0

Ý tưởng hay. Nhưng nếu Control chứa nằm trên đường viền nó sẽ không hoạt động. (Cung cấp tín dụng [tại đây] (http://stackoverflow.com/a/19361582/939213) cho người dùng đã nhận thấy nó.) – ispiro

5

Không có cách nào tốt để làm cho MouseLeave đáng tin cậy để kiểm soát vùng chứa. Làm nổi bật vấn đề này với bộ hẹn giờ:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     timer1.Interval = 200; 
     timer1.Tick += new EventHandler(timer1_Tick); 
     timer1.Enabled = true; 
    } 

    private bool mEntered; 

    void timer1_Tick(object sender, EventArgs e) { 
     Point pos = this.PointToClient(Cursor.Position); 
     bool entered = this.ClientRectangle.Contains(pos); 
     if (entered != mEntered) { 
      mEntered = entered; 
      if (!entered) { 
       // Do your leave stuff 
       //... 
      } 
     } 
    } 
} 
0

On điều khiển người dùng của bạn tạo ra một sự kiện mousehover cho kiểm soát của bạn như thế này, (hoặc loại sự kiện khác) như thế này

private void picBoxThumb_MouseHover(object sender, EventArgs e) 
{ 
    // Call Parent OnMouseHover Event 
    OnMouseHover(EventArgs.Empty); 
} 

On WinForm bạn nơi tổ chức các UserControl có điều này cho usercontrol để xử lý các MouseOver nên đặt này trong Designer.cs bạn

this.thumbImage1.MouseHover += new System.EventHandler(this.ThumbnailMouseHover); 

nào gọi phương pháp này trên WinForm bạn

private void ThumbnailMouseHover(object sender, EventArgs e) 
{ 

    ThumbImage thumb = (ThumbImage) sender; 

} 

đâu ThumbImage là loại usercontrol

8

Ovveride sự kiện MouseLeave để không kích hoạt quá lâu như chuột vào một điều khiển con

protected override void OnMouseLeave(EventArgs e) 
    { 
     if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition))) 
      return; 
     else 
     { 
      base.OnMouseLeave(e); 
     } 
    } 
Các vấn đề liên quan