2009-05-07 26 views
5

Tôi có quyền kiểm soát có cha mẹ là ScrollableControl. Làm cách nào để tìm phần kiểm soát thực sự hiển thị với người dùng? Cả hai đều là hình chữ nhật - không có doanh nghiệp vui nhộn với Khu vực.Làm cách nào để tìm phần hiển thị của điều khiển?

+1

Tại sao bạn muốn biết? Nó thường là tốt hơn để giải thích những gì bạn đang cố gắng hoàn thành; thường ai đó có thể có ý tưởng không trả lời câu hỏi cụ thể của bạn nhưng đưa bạn đến kết quả bạn muốn. –

Trả lời

3

AutoScrollPosition thể hiện vị trí của hình chữ nhật hiển thị của điều khiển có thể cuộn. Các giá trị tọa độ X và Y được lấy ra là âm nếu điều khiển đã cuộn ra khỏi vị trí bắt đầu của nó (0,0). Khi bạn đặt thuộc tính này, bạn phải luôn gán giá trị X và Y dương để đặt vị trí cuộn tương đối so với vị trí bắt đầu. Ví dụ: nếu bạn có thanh cuộn ngang và bạn đặt x và y là 200, bạn di chuyển 200 pixel sang bên phải; nếu bạn đặt x và y thành 100, cuộn sẽ xuất hiện để nhảy sang trái 100 pixel, bởi vì bạn đang đặt nó cách vị trí bắt đầu 100 pixel. Trong trường hợp đầu tiên, AutoScrollPosition trả về {-200, 0}; trong trường hợp thứ hai, nó trả về {-100,0}.

Nguồn: MSDN: ScrollableControl.AutoScrollPosition Property

10

Tôi nghĩ rằng phương pháp GetVisibleRectangle tôi viết dưới đây là những gì bạn đã yêu cầu. Các lần chạy liên tiếp này với thao tác cuộn sẽ mang lại kết quả sau khi điều khiển được cuộn:

  • {X = 0, Y = 0, Chiều rộng = 0, Chiều cao = 0} - button4 được cuộn ra ngoài tầm nhìn. Lưu ý rằng giá trị ở đây là Rectangle.Empty.
  • {X = 211, Y = 36, Chiều rộng = 25, Chiều cao = 13} - nút 4 được cuộn để góc trên bên trái hiển thị
  • {X = 161, Y = 36, Chiều rộng = 75, Chiều cao = 13 } - button4 được cuộn để nửa trên và toàn bộ chiều rộng là có thể nhìn thấy
  • {X = 161, Y = 26, width = 75, Height = 23} - button4 được cuộn là hoàn toàn có thể nhìn thấy

Lưu ý cách ngoài các thay đổi Chiều rộng và Chiều cao mà X, Y cũng thay đổi bằng cách cuộn.

Nguồn:

private void button1_Click(object sender, EventArgs e) 
{ 
    Rectangle r = GetVisibleRectangle(this.panel1, button4); 
    System.Diagnostics.Trace.WriteLine(r.ToString()); 
} 

public static Rectangle GetVisibleRectangle(ScrollableControl sc, Control child) 
{ 
    Rectangle work = child.Bounds; 
    work.Intersect(sc.ClientRectangle); 
    return work; 
} 
+0

Excelent! Tôi chỉ có một gợi ý, sử dụng 'child.Bounds.IntersectsWith (sc.ClientRectangle)' nếu bạn chỉ muốn biết là đứa trẻ trong "khu vực xem" của điều khiển. – Cipi

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