2008-10-04 37 views
11

Tôi cần kích hoạt sự kiện khi chuột ở trên PictureBox bằng nút chuột đã được nhấp và giữ.Làm thế nào tôi có thể phát hiện một nút chuột được giữ trên một PictureBox?

Sự cố:

Trình xử lý sự kiện MouseDown và MouseEnter không hoạt động tốt.

Ví dụ khi nhấn chuột và giữ nút chuột, C# sẽ kích hoạt trình xử lý sự kiện MouseDown, nhưng khi con trỏ di chuyển qua PictureBox sự kiện MouseEnter không kích hoạt, cho đến khi nút chuột được thực hiện.

Trả lời

14

Khi chuột được nhấn xuống hầu hết các điều khiển sau đó sẽ Control.Capture đầu vào chuột. Điều này có nghĩa là tất cả các sự kiện MouseMove được gửi đến điều khiển gốc được chụp thay vì điều khiển chuột sẽ kết thúc. Điều này tiếp tục cho đến khi chuột bị mất chụp thường xảy ra trên chuột lên.

Nếu bạn thực sự cần biết khi chuột nằm ngoài tầm kiểm soát của bạn ngay cả khi một điều khiển khác đã bắt chuột, thì bạn chỉ thực sự có một cách. Bạn cần phải snoop các cửa sổ tin nhắn mệnh cho các điều khiển khác bên trong ứng dụng của bạn. Để làm điều đó bạn cần thêm một bộ lọc tin nhắn ...

Application.AddMessageFilter(myFilterClassInstance); 

Sau đó, bạn cần phải thực hiện các IMessageFilter vào một lớp học phù hợp ...

public class MyFilterClass : IMessageFilter 
{ 
    public bool PreFilterMessage(ref Message m) 
    { 
     if (m.Msg == WM_MOUSEMOVE) 
      // Check if mouse is over my picture box! 

     return false; 
    } 
} 

Sau đó, bạn xem cho các sự kiện di chuyển chuột và kiểm tra xem họ đang trên hộp hình ảnh của bạn và làm bất cứ điều gì nó là bạn muốn làm.

-1

đặt cờ hoặc trạng thái khi di chuột xuống. nhả chuột lên. Khi di chuột qua đám cháy cho hộp hình, hãy kiểm tra trạng thái của bạn. Bây giờ bạn có thể phát hiện khi một người đang kéo thứ gì đó.

13

Chuột kiện

Sử dụng các sự kiện MouseDown chỉ phát hiện một ấn xuống một nút chuột và thiết lập this.Capture true để bạn sau đó nhận được các sự kiện chuột khác, ngay cả khi chuột rời khỏi sự kiểm soát (tức là bạn sẽ không nhận được một sự kiện MouseLeave vì bạn đã bắt được con chuột). Phát hành chụp bằng cách đặt this.Capture thành false khi MouseUp xảy ra.

Chỉ cần kiểm tra trạng thái của chuột

này có thể không liên quan, nhưng bạn có thể kiểm tra System.Windows.Control.MousePosition và xem nếu nó là trong PictureBox.ClientRectangle, sau đó kiểm tra Control.MouseButtons sở hữu tĩnh cho các nút có thể xuống Bất cứ lúc nào.

Như trong:

if (pictureBox.ClientRectangle.Contains(pictureBox.PointToClient(Control.MousePosition))) 
{ 
    if ((Control.MouseButtons & MouseButtons.Left) != 0) 
    { 
    // Left button is down. 
    } 
} 
+0

Sooo gần !! Clear this.capture hoạt động cho MouseLeave, nhưng không phải MouseEnter (của PictureBox khác) –

+0

Tôi không hoàn toàn hiểu những gì bạn đang cố gắng đạt được, vì vậy không, điều này sẽ không làm việc không may. –

3

Nếu bạn đang cố gắng thực hiện thao tác kéo và thả của một số loại, sự kiện Kéo ... (KéoEnter, DragDrop, vv) trên hộp nhận được là những gì bạn muốn sử dụng. Về cơ bản, bạn bắt đầu thao tác kéo bằng cách sử dụng phương thức DoDragDrop của điều khiển nguồn, và sau đó bất kỳ điều khiển nào bạn kéo qua sẽ có các sự kiện Kéo ... của nó được nâng lên.

Tìm kiếm "DoDragDrop" trên MSDN để xem cách triển khai.

+0

Từ âm thanh của sự vật, đây có lẽ là cách đi đúng đắn. Nếu giao diện người dùng không được định hướng kéo và thả, thì tại sao chúng ta lại tìm kiếm các sự kiện chuột bắt đầu trong một điều khiển và kết thúc bằng một điều khiển khác? :) –

5

Thiết lập một sự kiện MouseMove trong tầm kiểm soát PictureBox:

this.myPictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.myPictureBox_MouseMove); 

Sau đó, trong xử lý sự kiện MouseMove của bạn, hãy kiểm tra xem nếu nút chuột trái (hoặc bất kỳ) được nhấn:

private void myPictureBox_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
     // Do what you want to do 
} 
+0

Lưu ý: Đây là một API WinForms, không phải là WPF (+1 anyway!) – Li3ro

0

Cách tốt nhất để di chuyển Biểu mẫu dựa trên vị trí chuột và kiểm soát vị trí tương đối tương tự như những gì Ian Campbell đã đăng.

private void imgMoveWindow_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      Form1.ActiveForm.Left = Control.MousePosition.X - imgMoveWindow.Left - (imgMoveWindow.Size.Width/2); 
      Form1.ActiveForm.Top = Control.MousePosition.Y - imgMoveWindow.Top - (imgMoveWindow.Size.Height/2); 
     } 

    } 

Trường hợp imgMoveWindow là PictureBox Control.

Bruno Ratnieks

Sniffer Networks

Các vấn đề liên quan