2012-12-17 41 views
8

Tôi đã tạo một lớp cho phép người dùng kéo các ô trên biểu mẫu hay không. Làm thế nào tôi có thể đảm bảo rằng người dùng không đặt hai bảng trên đầu trang của nhau? Nếu họ làm, tôi muốn thay đổi/hoặc đánh dấu một trong những điều khiển trong khi cả hai đều chồng lên nhau.Cách kiểm tra xem hai điều khiển có bị chồng chéo trong Windows Forms

Tôi đã thử đặt cài đặt này trong sự kiện OnMouseDown nhưng điều đó không hoạt động.

Ngoài ra, số lượng bảng trên biểu mẫu khác nhau tùy thuộc vào số lượng hình ảnh mà biểu mẫu cần hiển thị. Mỗi bảng có một hình tượng bên trong bảng điều khiển.

+0

Bạn có thể thử kiểm tra tất cả các bảng hiện có, nếu vị trí rơi của bảng điều khiển mới được che phủ bởi bảng hiện có. Bạn chỉ cần có một số toán học với vị trí và kích thước của điều khiển. – sgud

Trả lời

1

Vì vậy, tôi đã có thể giải quyết câu hỏi này với sự trợ giúp của đề xuất của sgud.

Bí quyết là sử dụng phương thức Rectangle.Intersect bên trong sự kiện OnMouseUp được nêu ra.

Đây là trực giác mà tôi đã sử dụng phía sau nó. (nó có thể không phải là giải pháp gọn gàng nhất)

1) Tạo danh sách tất cả các điều khiển bên trong bảng điều khiển chính của tôi.

2) Traverse thông qua các điều khiển và tạo danh sách tất cả các giới hạn hình chữ nhật cho mỗi điều khiển. bạn có thể nhận được điều này bằng control.Bounds

3) Đi qua danh sách các giới hạn và giao cắt với giới hạn của phần tử hiện đang hoạt động.
Nếu hình chữ nhật được trả về có chiều cao và chiều rộng giống với điều khiển hoạt động thì hãy gán thay đổi thuộc tính màu sau.

Tôi hy vọng điều này sẽ giúp cho bất cứ ai khác mà có một vấn đề tương tự

7

Một cách tiếp cận tốt hơn là sử dụng phương pháp Rectangle.Bounds.IntersectsWith, mà không kiểm tra cho bạn và có thể sản xuất mã sạch hơn. Cá nhân tôi không biết về bất kỳ vấn đề hiệu suất hay lợi ích nào, theo cách này hay cách khác, mặc dù tôi sẽ mạo hiểm đoán rằng chỉ cần lặp qua các điều khiển của bạn và kiểm tra chúng với điều này sẽ nhanh hơn xây dựng danh sách và lặp lại cả hai.

Picturebox pic = new Picturebox(); 
foreach(Control picturebox in Form1){ 
    if (pic.Bounds.IntersectsWith(picturebox.Bounds)) 
    { 
     //We have a problem, Houston, because we just collided! 
    } 
} 

Tôi hy vọng điều này sẽ giúp, mặc dù bạn đã hỏi câu hỏi này một thời gian trước đây.

+0

Tôi đã tra cứu chức năng này và có vẻ như nó sẽ hoạt động. Tuy nhiên, tôi không làm việc trên dự án này nữa, vì vậy sẽ không thể kiểm tra nó ra. Cảm ơn mặc dù. –

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