2010-10-06 11 views
10

tôi đang tạo ra một ứng dụng mà tôi cần phải tạo ra điều khiển tự động tạo nói textbox hoặc dán nhãn, vvLàm thế nào để cho phép người dùng kéo một điều khiển tự động tạo ra tại địa điểm lựa chọn của mình

Bây giờ những gì tôi dùng có thể di chuyển mà hộp văn bản đến vị trí mong muốn của mình. Giống như chúng ta làm trong Visual Studio. Một cách là có được vị trí mới bằng cách nhận giá trị từ anh ấy bằng cách sử dụng hộp văn bản. Nhưng tôi muốn giao diện người dùng dễ dàng.

Chúng ta có thể có chức năng như vậy trong winforms

+1

Có, nhưng bạn sẽ cần phải làm việc chăm chỉ. – SLaks

+0

@SLaks: Bạn có thể hướng dẫn tôi một chút không. Tôi có thể dành nhiều thời gian theo yêu cầu. Tôi đã giải quyết vấn đề này trong công việc của mình nhưng ở đó chúng tôi đã thuyết phục khách hàng của mình là không thể. Nhưng tôi biết nó là có thể Vì vậy, tôi muốn làm điều đó tại nhà của tôi. Vui lòng cho tôi biết bắt đầu từ đâu. –

Trả lời

20

Tôi đã tạo một biểu mẫu đơn giản minh họa cách di chuyển điều khiển bằng cách kéo điều khiển. Ví dụ giả định có một nút có tên là button1 trên biểu mẫu được đính kèm với trình xử lý sự kiện có liên quan.

private Control activeControl; 
private Point previousLocation; 

private void button1_Click(object sender, EventArgs e) 
{ 
    var textbox = new TextBox(); 
    textbox.Location = new Point(50, 50); 
    textbox.MouseDown += new MouseEventHandler(textbox_MouseDown); 
    textbox.MouseMove += new MouseEventHandler(textbox_MouseMove); 
    textbox.MouseUp += new MouseEventHandler(textbox_MouseUp); 

    this.Controls.Add(textbox); 
} 

void textbox_MouseDown(object sender, MouseEventArgs e) 
{ 
    activeControl = sender as Control; 
    previousLocation = e.Location; 
    Cursor = Cursors.Hand; 
} 

void textbox_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (activeControl == null || activeControl != sender) 
     return; 

    var location = activeControl.Location; 
    location.Offset(e.Location.X - previousLocation.X, e.Location.Y - previousLocation.Y); 
    activeControl.Location = location; 
} 

void textbox_MouseUp(object sender, MouseEventArgs e) 
{ 
    activeControl = null; 
    Cursor = Cursors.Default; 
} 
+1

Đây là video mà tôi đã tạo sau khi triển khai http://www.youtube.com/watch?v=itdFYe7La-Y này –

1

Bạn có thể gọi DoDragDrop với một đối tượng dữ liệu có chứa hoặc đại diện điều khiển để bắt đầu giảm hoạt động kéo &, sau đó xử lý sự kiện của thùng chứa DragDrop và di chuyển điều khiển.

Nếu bạn muốn nhìn thấy sự kiểm soát khi nó được kéo, bạn có thể thực hiện một cách minh bạch (xử lý WM_NCHITTEST) hình thức dưới chuột cho thấy sự kiểm soát (gọi DrawToBitmap), hoặc không sử dụng kéo & thả ở tất cả và thay vào đó xử lý sự kiện chuột và theo dõi trạng thái theo cách thủ công.

Nếu bạn muốn đường viền kiểu Visual Studio, bạn có thể so sánh giới hạn của điều khiển với các điều khiển khác, tạo một tập hợp các đường để vẽ và vẽ chúng trong một sự kiện sơn.

+0

Tôi có thể thấy trên các sự kiện Bảng điều khiển và Nút điều khiển. Họ không có sự kiện DoDragDrop/Property. Tôi có phải AllowDrop là đúng không. –

+0

Có; bạn cần đặt 'AllowDrop' trên vùng chứa. 'DoDragDrop' là một phương thức mà bạn cần gọi trên MouseMove ngay sau khi MouseDown nếu chuột di chuyển ra ngoài' SystemInformation.DragSize'. – SLaks

+0

Xem ví dụ tại đây: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dodragdrop.aspx – SLaks