2011-12-19 34 views
6

Làm thế nào để bạn nhận được tất cả các nhấp chuột để thực hiện sự kiện? Tôi nhận thấy nếu bạn nhấp quá nhanh, nó cho rằng bạn đang nhấp đúp và không gửi các nhấp chuột tới trình xử lý sự kiện. Có cách nào để có được tất cả các nhấp chuột không?WinForms vô hiệu hóa nhấp đúp và chấp nhận tất cả nhấp chuột?

+2

Sử dụng sự kiện được thay thế. –

+0

@RussellTroywest Tôi nghĩ rằng [MouseClick] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mouseclick%28VS.80%29.aspx) sự kiện sẽ tốt hơn. Vì nâng thứ tự. –

+1

@Michael: Theo MSDN "Hai nhấp chuột duy nhất xảy ra đủ gần đúng thời gian, được xác định bởi cài đặt chuột của hệ điều hành của người dùng, sẽ tạo sự kiện MouseDoubleClick thay vì sự kiện MouseClick thứ hai." - Đó là những gì High đang thấy. –

Trả lời

9

Không chắc tại sao câu hỏi này có tiền thưởng, câu trả lời được chấp nhận phải khá gần với giải pháp. Ngoại trừ việc bạn nên sử dụng MouseUp thay vì MouseDown, người dùng của bạn thường mong đợi một hành động nhấp chuột có hiệu lực khi anh ta nhả nút. Trong đó cung cấp back-out "oops, không có nghĩa là nhấp vào nó, di chuyển chuột để nó bị bỏ qua" tùy chọn.

Tuy nhiên, đối với các điều khiển Winforms tích hợp, như PictureBox, điều này có thể cấu hình với phương thức Control.SetStyle(). Thêm một lớp mới vào dự án của bạn và dán mã được hiển thị bên dưới. Biên dịch. Thả điều khiển mới từ phía trên cùng của hộp công cụ:

using System; 
using System.Windows.Forms; 

class MyPictureBox : PictureBox { 
    public MyPictureBox() { 
     this.SetStyle(ControlStyles.StandardDoubleClick, false); 
    } 
} 

Tuy nhiên, hãy cẩn thận vì điều này sẽ không hoạt động đối với lớp .NET bao bọc điều khiển Windows hiện có. Giống như TextBox, ListBox, TreeView, vv Cấu hình cơ bản cho đó là cờ kiểu WNDCLASSEX.style member, CS_DBLCLKS. Mã đặt cờ kiểu đó được đưa vào Windows và không thể thay đổi được. Bạn cần loại phẫu thuật khác nhau để chuyển một lần nhấp đúp vào một lần nhấp. Bạn có thể làm như vậy bằng cách ghi đè phương thức WndProc(), tôi sẽ đưa ra một ví dụ cho TextBox:

using System; 
using System.Windows.Forms; 

class MyTextBox : TextBox { 
    protected override void WndProc(ref Message m) { 
     // Change WM_LBUTTONDBLCLK to WM_LBUTTONCLICK 
     if (m.Msg == 0x203) m.Msg = 0x201; 
     base.WndProc(ref m); 
    } 
} 

Chỉ cần thay đổi tên lớp nếu bạn muốn làm điều đó cho các điều khiển khác. Commandformering Winforms để làm cho nó hoạt động theo cách bạn muốn không bao giờ mất nhiều mã, chỉ cần Petzold :)

-2

Tôi nghĩ bạn muốn đếm tất cả nhấp chuột. Nếu bạn muốn đếm số lần nhấp thì hãy đặt một biến số lượt truy cập và tăng biến đó trong sự kiện nhấp chuột. Có thể trợ giúp này cho bạn ....

+0

Tự làm điều đó và nhấp vào nó nhanh gấp 10 lần. Bạn sẽ nhận được một số nhỏ hơn 10. Tôi muốn tất cả 10 trong số các nhấp chuột đó. – Will

2

Bạn muốn sử dụng điều khiển sự kiện MouseDown thay cho sự kiện Nhấp chuột. MouseDown sẽ được gọi mỗi lần chuột được "ép" trên điều khiển đó. Nhấp vào có thể không được gọi nếu hệ thống cho rằng đó là nhấp đúp. Thay vào đó, sự kiện DoubleClick sẽ được nâng lên.

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