2008-10-20 46 views
8

Tôi muốn ghi đè OnMouseClick và OnMouseDoubleClick và thực hiện các tác vụ khác nhau tùy thuộc vào kiểu nhấp chuột nào được sử dụng.Làm cách nào để phân biệt giữa các nhấp chuột đơn và nhấp đúp trong .Net?

Sự cố là OnMouseClick đang diễn ra cho cả nhấp chuột đơn và nhấp đúp và được gọi trước khi OnMouseDoubleClick.

Tôi chắc chắn điều này phải là yêu cầu chung, vì vậy tôi đoán tôi thiếu một điều gì đó khá rõ ràng. Có ai đó có thể làm vừa lòng tôi?

Chỉnh sửa để thêm: số MouseEventArgs.Clicks không giúp ích. Trong trường hợp nhấp đúp, nhấp chuột đầu tiên được xử lý dưới dạng một cú nhấp chuột trong OnMouseClick với MouseEventArgs.Clicks == 1.

Chỉnh sửa để thêm: các đối tượng là hình thu nhỏ của hình ảnh. Nhấp chuột duy nhất sẽ bật/tắt lựa chọn để xuất. Nhấp đúp sẽ làm hình thu nhỏ ở chế độ toàn màn hình. Các hành động lựa chọn và "kích hoạt" là trực giao. Điều này có thể chỉ ra một vấn đề tiềm ẩn với hai hành động ...

Chúc mừng, Rob

+0

Bạn đang thực hiện hành vi nào giữa đơn và nhấp đúp? Tiêu chuẩn Windows là một cú nhấp chuột = chọn, bấm đúp = mở, làm cho nhấp chuột duy nhất chọn "an toàn" để xử lý trước khi mở ... –

+0

Bật và tắt các nhấp chuột duy nhất để chọn (chọn hình thu nhỏ để xuất). Kích đúp vào kích hoạt (làm cho một hình thu nhỏ toàn màn hình). Vì vậy, việc lựa chọn và kích hoạt là hai hoạt động riêng biệt. – Rob

+0

Nhưng bạn sẽ muốn chọn trước khi bạn kích hoạt, do đó sẽ không làm mất hiệu lực xử lý chúng một cách độc lập. Ngoài ra, trong sử dụng chung, bỏ chọn là nhấp vào một nơi khác, không phải là nhấp chuột duy nhất thứ hai. –

Trả lời

12

Điều đó xảy ra trong suốt Windows. Tôi không nghĩ rằng họ thêm bất cứ điều gì đặc biệt để xử lý nó trong. Net.

Các phương tiện bình thường xử lý này là

  • a) chỉ làm một cái gì đó đơn nhấp chuột bạn muốn xảy ra trước khi một nhấn đúp chuột, giống như chọn.
  • b) nếu đó không phải là tùy chọn, thì trên sự kiện nhấp, hãy bắt đầu hẹn giờ. Trên đánh dấu hẹn giờ, thực hiện thao tác nhấp chuột đơn. Nếu sự kiện nhấp đúp xảy ra trước, hãy tắt bộ hẹn giờ và thực hiện thao tác nhấp đúp.

Lượng thời gian bạn đặt thời gian cho phải bằng thời gian Nhấp đúp của hệ thống (người dùng có thể chỉ định trong bảng điều khiển). Nó có sẵn từ System.Windows.Forms.SystemInformation.DoubleClickTime. Chi tiết đầy đủ nằm trong MSDN, here

+0

Hãy nhớ khi thiết lập bộ hẹn giờ của bạn mà mọi người có thể và thường KHÔNG xoay quanh bằng cài đặt nhấp đúp: http://blogs.msdn.com/oldnewthing/archive/2008/10/02/8969396.aspx ... Hãy chắc chắn để đáp ứng điều đó, nếu không bạn vẫn có thể nhận được một nhấp chuột duy nhất trước khi tăng gấp đôi trong một số trường hợp lạ. –

+0

Đồng hồ hẹn giờ !? Nooooooo! (OK, tôi chấp nhận rằng nó thực tế, nhưng nó không đẹp. Đây có phải là cách duy nhất không?) Chúc mừng, Rob – Rob

+0

+ 1 đến tùy chọn a. tùy chọn b có thể được thực hiện, nhưng như John nói, những điều xấu có thể xảy ra. Trong kịch bản của bạn, an toàn khi sử dụng lần nhấp đầu tiên = chọn, nhấp chuột thứ hai = toàn màn hình – mathieu

0

Vấn đề là hầu hết các đối tượng đều không triển khai cả hai. Một vài đối tượng có thể có hành động khác nhau cho các nhấp chuột đơn và kép thường là OK để chạy hành động nhấp chuột duy nhất trước hành động nhấp đúp (đánh dấu sau đó mở thư mục, nhập tiêu điểm trên thanh địa chỉ trước khi chọn, v.v.) cách để xác định có lẽ sẽ là chờ một nhấp chuột trong một khoảng thời gian và hủy hành động cho một lần nhấp nếu phát hiện thấy nhấp đúp.

-1

Bạn có thể bắt đầu hẹn giờ trong trình xử lý sự kiện OnMouseClick.

  • Nếu hẹn giờ hết giờ (giả sử 300ms) thì chỉ cần một lần nhấp.

khác

  • Nếu một sự kiện OnMouseClick đã được tạo trước thời gian thời gian ra bạn có thể kiểm tra x & y vị trí của các nhấp chuột và nếu nó trong vòng bán kính đặc biệt của nhấp chuột đầu tiên sau đó hành động chức năng nhấp đúp.

Nếu không

  • Xử lý nhấp chuột đầu tiên và hẹn giờ tái khởi cho nhấp chuột thứ hai

NB: thực hiện này có lợi thế là một thực tế rằng cả timeoput và 'đôi bán kính -click 'có thể được cấu hình độc lập với cấu hình hệ thống cho phép nhập/xuất vào nhiều máy/

+0

Nhưng có bất lợi khi bỏ qua tùy chọn thời gian chờ nhấp đúp của người dùng! – Rob

+0

Điều này đúng, nhưng nó có nghĩa là bạn có thể tạo ra một hệ thống nhất quán mà người dùng độc lập. Tôi cho rằng nó tóm tắt những người sử dụng hệ thống, một người dùng hoặc nhiều người dùng. –

0

Một giải pháp khác có thể là có OnMouseDoubleClick gọi OnMouseClick. Kể từ khi hành động trong OnMouseClick là một chuyển đổi nhị phân, gọi nó hai lần đặt lại nó vào trạng thái tương tự.

Vì vậy, khi người dùng nhấp đúp, cửa sổ gọi OnMouseClick, sau đó nhấp OnMouseDoubleClick. OnMouseDoubleClick gọi OnMouseClick (lại) để khôi phục trạng thái, sau đó xử lý nhấp đúp.

Điều này cảm thấy không hài lòng như một giải pháp, nhưng nó hoạt động.

Sử dụng bộ đếm thời gian (để nuốt nhấp chuột đầu tiên của nhấp chuột đôi) đều không hài lòng và có thêm sự phức tạp trong việc xử lý tùy chọn tỷ lệ nhấp đúp của người dùng.

Chúc mừng, Rob

+0

Tôi không chắc chắn rằng thậm chí hoạt động.Ví dụ: Người dùng nhấp vào A, sau đó nhấp đúp vào B, chọn, bỏ chọn và mở rộng B. Bây giờ, đã chọn B, bỏ chọn A? Nếu vậy, bạn đang say. –

+0

Các đối tượng được xử lý độc lập, vì vậy A độc lập với B. Trong quá trình thực hiện của tôi, vị trí con trỏ được truyền qua thông qua MouseEventArgs được sử dụng để xác định hình ảnh nào được nhấp vào. – Rob

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