2013-03-10 35 views
8

Tôi có phương thức Drag() trên sự kiện form_MouseDown. Tôi cũng có một sự kiện bấm vào biểu mẫu. Vấn đề là nếu tôi nhấp vào biểu mẫu, sự kiện MouseDown sẽ được kích hoạt và nó sẽ không bao giờ có cơ hội kích hoạt sự kiện nhấp chuột.MouseDown và Nhấp chuột xung đột

Cách tốt nhất để giải quyết vấn đề này là gì? Tôi đã suy nghĩ đếm pixel nếu hình thức thực sự được kéo, nhưng phải có một cách tốt hơn. Bất kỳ đề xuất?

+0

"đếm pixel" là khá phổ biến, bởi vì trong hầu hết các trường hợp bạn thực sự ** không muốn ** kéo để bắn ra khi 'khoảng cách chuyển động' ngắn hơn, ví dụ: 7,15 pixel. Ngay cả máy tính để bàn của windows cũng có ngưỡng pixel nhỏ như vậy. – quetzalcoatl

+2

Không sử dụng 'Nhấp vào' và sử dụng' MouseUp' thay thế? – Neolisk

+0

Tôi đã tạo bản trình diễn và tôi không nhận được hành vi này. Sau khi nhấp chuột vào MouseDown đạt được. Bạn có thể đăng một số mã không? –

Trả lời

2

Tôi đã suy nghĩ đếm pixel nếu biểu mẫu thực sự là kéo, nhưng phải có một cách tốt hơn.

Không, đó chính xác là cách bạn phải thực hiện.

Đây không chỉ là giới hạn phần mềm; nó cũng rất thực tế. Nếu bạn nghĩ qua vấn đề từ góc nhìn của người dùng, bạn sẽ thấy ngay vấn đề cũng như giải pháp. Hãy tự hỏi, sự khác nhau giữa nhấp chuột và kéo là gì?

Cả hai bắt đầu bằng nút chuột di chuyển xuống đối tượng, nhưng một trong số đó kết thúc bằng nút chuột quay lại đối tượng ở cùng vị trí và nút kia kết thúc bằng nút chuột sẽ sao lưu một vị trí hoàn toàn khác.

Vì các máy thời gian chưa được hoàn thiện, bạn không có cách nào biết điều này trước. Vì vậy, có, bạn cần phải duy trì một số loại ngưỡng khoảng cách và nếu con trỏ di chuyển ra ngoài ngưỡng khoảng cách đó trong khi nó rơi xuống đối tượng thì bạn sẽ xem xét việc kéo. Nếu không, bạn xem nó là một cú nhấp chuột.

Ngưỡng khoảng cách đó không được bằng 0. Người dùng không được yêu cầu giữ chuột hoàn toàn vẫn là để bắt đầu kéo. Rất nhiều người sử dụng được mệnh cận. Họ rất có khả năng co giật nhẹ khi cố gắng bấm. Nếu ngưỡng là 0, thì cuối cùng chúng sẽ thực hiện rất nhiều thao tác kéo vô ý khi họ cố gắng nhấp.

Tất nhiên, bạn không thực sự phải lo lắng về bất kỳ điều này hoặc tự tính ngưỡng kéo.Thay vào đó, hãy sử dụng các giá trị mặc định của Windows, có thể lấy được bằng cách gọi hàm GetSystemMetrics và chỉ định SM_CXDRAG hoặc SM_CYDRAG. (Đây có thể được tiếp xúc ở đâu đó bởi khuôn khổ WinForms, nhưng tôi không nghĩ vậy. Nó chỉ là dễ dàng để P/Gọi chúng mình.)

const int SM_CXDRAG = 68; 
const int SM_CYDRAG = 69; 
[DllImport("user32.dll")] 
static extern int GetSystemMetrics(int index); 

Point GetDragThreshold() 
{ 
    return new Point(GetSystemMetrics(SM_CXDRAG), GetSystemMetrics(SM_CYDRAG)); 
} 
+0

Trong khi bạn có điểm tốt tổng thể ở đây, chương trình nên được thiết kế theo cách kéo và thả bất kỳ thứ gì 5px sang một bên không gây ra bất kỳ điều gì xảy ra. Nếu không, bạn không bao giờ biết, có thể lắc 5px là không đủ để một số người thực hiện một cú nhấp chuột, và họ cần 10px. Với việc triển khai thích hợp, chuyển động của chuột không liên quan. Ví dụ, nếu bạn drap & thả tập tin vào chính nó trong Windows, không có gì xảy ra. – Neolisk

+0

Hãy tưởng tượng rằng bạn đang tạo ra trình thiết kế WinForms. Ngay cả khi được triển khai đúng cách, di chuyển chuột vẫn có liên quan. Đó là một thiết kế hoàn toàn khác với Windows Explorer, nơi nó không có ý nghĩa gì khi thả một biểu tượng vào chính nó. Nhưng bạn chắc chắn có thể kéo một điều khiển một vài điểm ảnh theo bất kỳ hướng nào. Hoặc một lựa chọn trong trình chỉnh sửa ảnh. Hoặc bất kỳ số trường hợp nào khác mà quy tắc "triển khai đúng" sẽ không hoạt động. –

+0

Trong những trường hợp đó, bạn sẽ sử dụng định vị bàn phím (phím mũi tên). Nó làm chính xác điều đó - di chuyển theo hướng được chỉ định bởi 1 pixel. Nếu không, bạn sẽ muốn, ví dụ trong VS, kiểm soát để dính vào một trong hai hình thức lưới điện, hoặc điều khiển khác. Trong cả hai trường hợp, VS sẽ hỗ trợ bạn định vị. Trong photoshop hoặc sơn bạn có thể 1) sử dụng các phím mũi tên hoặc 2) có nó thu nhỏ xuống điểm khi di chuyển bởi một vài điểm ảnh trong hai hướng trở nên không thích hợp. – Neolisk

2

Unfortunatelly, tại thời điểm khi "button-is-pressed" bạn chưa biết nếu hành động mong muốn chỉ là một cú nhấp chuột hoặc kéo thả. Bạn sẽ tìm thấy nó ra sau.

Đối với nhấp chuột, yếu tố quyết định là "không có chuyển động" và "nút lên".

Để kéo, yếu tố quyết định là "chuyển động" và "nút lên".

Do đó, để phân biệt các tương tác đó, bạn phải theo dõi không chỉ các nút, mà còn theo dõi chuyển động. Bạn không cần phải theo dõi chuyển động tổng thể, chỉ có sự chuyển động giữa nút ấn xuống và nút bấm là thú vị. do đó

Những sự kiện là một nơi tốt để bắt đầu/dừng các cơ chế Mouse.Capture (để tự động hiện kéo adornersthả vị trí gợi ý), hoặc, ở dạng đơn giản hơn - để lưu trữ nguồn gốc và mục tiêu của phong trào vector và kiểm tra xem khoảng cách là> D (ngay cả khi di chuyển xảy ra, sẽ có một số khoảng cách tối thiểu an toàn trong đó DRAG bị hủy bỏ. Đôi khi, con chuột "lởm chởm" và mọi người thực sự không muốn ứng dụng của bạn bắt đầu kéo khi họ nhấp đúp vào cuối chuyển động của con trỏ chuột nhanh :))

2

tôi tìm thấy giải pháp này, mặc dù nó là một đôi nhấp chuột và chuột xuống các sự kiện:

void pictureBox_MouseDown(object sender, MouseEventArgs e) 
{ 
if (e.Button == MouseButtons.Left && e.Clicks ==1) 
{ 
PictureBox pb = (PictureBox)sender; 
DoDragDrop((ImageData)pb.Tag, DragDropEffects.Copy); 
} 
} 

nguồn: http://code.rawlinson.us/2007/04/c-dragdrop-and-doubleclick.html

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