2009-02-03 33 views
5

Trong MFC một sự kiện click đúp chuột gây nên trình tự sau đây của thông điệpPhát hiện một click chuột duy nhất trong MFC

  • WM_LBUTTONDOWN
  • WM_LBUTTONUP
  • WM_LBUTTONDBCLK
  • WM_LBUTTONUP

Vì vậy, phản hồi lại thông báo WM_LBUTTONDBCLK cho phép bạn phát hiện đôi -nhấp chuột. Nhưng nếu tôi chỉ muốn phát hiện một nhấp chuột thì làm cách nào để phân biệt nó?

Nhưng chỉ cần nhìn vào thông báo WM_LBUTTONUP không đủ vì nó có thể là một nhấp chuột hoặc đó có thể là nhấp chuột đầu tiên của nhấp chuột đôi.

Làm cách nào tôi có thể xác định thành công chỉ bằng một cú nhấp chuột?

Trả lời

10

(Xin cho phép tôi gọi đó là các sự kiện chuột Up and Mouse Down. MFC của tôi là một chút gỉ. Và có công cụ này được gọi là NET của những người bị rối tung lên thuật ngữ của tôi thời gian gần đây ;-)

câu chuyện ngắn : Bạn không chỉ muốn biết về Nhấp chuột. Bạn cần nhiều hơn nữa.

câu chuyện dài:

Mặc dù đây là phản trực giác, dường như chỉ đơn giản là muốn một cái click chuột là khá phổ biến. Thông thường, bạn sẽ muốn thực hiện một số thao tác trên Mouse Down và thực hiện thêm một số thao tác trên Mouse Up. Bí quyết là chỉ đơn giản là theo dõi các tin nhắn Mouse Up là không đủ: Chuột xuống có thể không xảy ra trong cửa sổ của bạn. Bạn có coi đó là một nhấp chuột hợp lệ không? Đặc biệt xem xét việc xử lý Mouse Down (chẳng hạn như chọn một mục) đã không xảy ra.

Tiếp tục đưa ra lý do, bạn không nên dựa vào việc nhận Chuột lên sau khi bạn xử lý Chuột xuống: Người dùng có thể đã di chuyển chuột và nhả nút ở nơi khác (nghĩ rằng drag'n'drop), trong trường hợp đó, bạn không nhận được sự kiện MouseUp ... trừ khi bạn bắt chuột trên MouseDown để đảm bảo rằng bạn nhận được sự kiện chuột lên đến Chuột lên ngay cả khi con chuột rời khỏi cửa sổ của bạn.

Tất cả trong tất cả, bạn kết thúc theo dõi Chuột xuống, chụp chuột và khi bạn nhận được Chuột lên, chỉ cần kiểm tra xem bạn có sở hữu ảnh chụp hay không. Nếu không, con chuột đã được nhấp đúp (không có con chuột thứ hai xuống) hoặc chuột xuống xảy ra ở một nơi khác do đó bạn rất có thể không quan tâm về điều này Chuột lên.

Trong kết luận: Không có thông báo MouseClick đơn giản vì bạn sẽ không đi xa lắm: Bạn cần phải xử lý nhiều thư hơn và triển khai nhiều cơ chế hơn.

Oh! Và nếu giao dịch của bạn với một điều khiển hiện tại đã xử lý tất cả các mục này và các công cụ lựa chọn, chẳng hạn như listview, rất có thể là nó cung cấp một thông báo tùy chỉnh tương tự như Item Activate hoặc Item Selection Changed.

-2

Bạn thường xem @MLButtonUp và bạn sẽ không có nhấp chuột đơn và nhấp đúp vào hành vi trên cùng một nút chuột.

0

Bạn có thể kiểm tra WM_LBUTTONDOWN không được gọi nhiều hơn một lần trước WM_LBUTTONUP. Trong thực tế Windows thực hiện điều này cho bạn, trong đó nếu bạn nhận được một WM_LBUTTONDBCLK bạn có xu hướng không nhận được một WM_LBUTTONUP.

0

Bạn có thể sử dụng PreTranslateMessage() để đếm các thông báo khi chúng xuất hiện. Nếu bạn chỉ nhận được các thông báo chuột tương ứng với một lần nhấp chuột và thời gian được định cấu hình hệ thống cho nhấp đúp đã hết hạn, bạn có thể yên tâm cho rằng đó là một lần nhấp. Theo như tôi biết không có cách nào để biết rằng đây là trường hợp như nó đang xảy ra, có ý nghĩa - cho đến khi hết hạn, không có cách nào để biết rằng nhấp chuột thứ hai là hay không sắp tới.

0

hơi phức tạp một chút.

Tôi sẽ phát hiện kết hợp WM_LBUTTONDOWN & WM_LBUTTONUP, lưu trữ sự kiện đó ở đâu đó và đặt thời gian chờ trong một giây. Nếu không có WM_LBUTTONDBCLK trong thời gian chờ đó thì bạn có một cú nhấp chuột.

Điều này có nghĩa là bạn cần phải chạy một chuỗi khác nhưng tôi nghĩ bạn có thể thực hiện nó bằng một chuỗi.

1

Tôi vừa thử điều này trong Delphi, hành vi là như nhau: ngay cả khi nhấp đúp đang xảy ra, một sự kiện nhấp chuột duy nhất được phát hành ngay sau lần đầu tiên trong hai.

Tôi giải quyết nó sử dụng một bộ đếm thời gian, hoạt động như thế này:

  • Tắt hẹn giờ trên WM_LBUTTONDBLCLK (và thiết lập bDbl để true)
  • kích hoạt hẹn giờ trên WM_LBUTTONUP nếu bDbl==false
  • tắt trên WM_LBUTTONUP nếu bDbl==true (và đặt lại bDbl)

Tôi đặt inte rval của bộ đếm thời gian đến thời gian được trả về bởi GetDoubleClickTime.

MSDN nói:

Các GetDoubleClickTime chức năng lấy dòng điện kích đúp vào thời gian cho các con chuột. Nhấp đúp chuột là một chuỗi hai lần nhấp chuột của nút , lần xuất hiện thứ hai trong khoảng thời gian được chỉ định sau lần đầu tiên là . Thời gian nhấp chuột nhấp chuột tối đa là số mili giây có thể xảy ra giữa nhấp chuột đầu tiên và thứ hai là nhấp đúp.

Nếu hẹn giờ xảy ra cháy thì bạn có nhấp chuột thực. Trong trường hợp của tôi, khoảng thời gian nhấp đôi là 500ms, vì vậy, bất kỳ "nhấp chuột thực tế" nào sẽ bị trì hoãn trong thời gian dài.

0

Tôi nghĩ giải pháp là bắt đầu hẹn giờ sau lần nhấp đầu tiên & rồi kiểm tra thời gian đã trôi qua sau lần nhấp ngay lập tức, điều này sẽ cho bạn biết đó là nhấp chuột hay nhấp đúp.

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