2010-09-23 29 views
6

Tôi có biểu tượng thắng mà tôi muốn cho phép người dùng di chuyển điều khiển.Cách cho phép người dùng di chuyển điều khiển trên biểu mẫu

Việc kiểm soát là (bây giờ) một đường thẳng đứng: nhãn có đường viền và chiều rộng 1.

Bối cảnh không phải là rất quan trọng nhưng tôi sẽ đưa nó cho bạn anyways. Tôi có một nền tảng với một số đồ họa và tôi muốn người dùng có thể trượt một hướng dẫn trên đồ họa. Đồ họa được thực hiện với thư viện NPlots. Có vẻ như sau: http://www.ibme.de/pictures/xtm-window-graphic-ramp-signals.png

Nếu tôi có thể tìm hiểu cách người dùng có thể nhấp và kéo điều khiển nhãn/dòng xung quanh màn hình, tôi có thể giải quyết vấn đề hướng dẫn của mình. Hãy giúp tôi.

Trả lời

8

Mã cho việc này có thể phức tạp một chút, nhưng về cơ bản bạn sẽ cần phải nắm bắt các sự kiện MouseDown, MouseMove và MouseUp trên biểu mẫu của mình. Một cái gì đó như thế này:

public void Form1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if(e.Button != MouseButton.Left) 
     return; 

    // Might want to pad these values a bit if the line is only 1px, 
    // might be hard for the user to hit directly 
    if(e.Y == myControl.Top) 
    { 
     if(e.X >= myControl.Left && e.X <= myControl.Left + myControl.Width) 
     { 
      _capturingMoves = true; 
      return; 
     } 
    } 

    _capturingMoves = false; 
} 

public void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if(!_capturingMoves) 
     return; 

    // Calculate the delta's and move the line here 
} 

public void Form1_MouseUp(object sender, MouseEventArgs e) 
{ 
    if(_capturingMoves) 
    { 
     _capturingMoves = false; 
     // Do any final placement 
    } 
} 
+0

Cảm ơn! Hoạt động hoàn hảo. – Roast

3

Trong WinForms, bạn có thể xử lý sự kiện MouseDown, MouseMove và MouseUp của điều khiển. Trên MouseDown, thiết lập một số bit hoặc tài liệu tham khảo cho biết hình thức của bạn điều khiển con chuột được nhấp vào, và nắm bắt X và Y của chuột từ MouseEventArgs. Trên MouseMove, nếu điều khiển được thiết lập, hãy điều chỉnh X và Y của nó bằng sự khác biệt giữa lần X và Y cuối cùng của bạn và tọa độ hiện tại. Trên MouseUp, hãy giải phóng điều khiển.

Tôi sẽ thiết lập "chế độ chỉnh sửa" cho việc này; khi người dùng vào chế độ này, các trình xử lý sự kiện hiện tại của các điều khiển biểu mẫu của bạn phải được tách ra và các trình xử lý chuyển động được đính kèm. Nếu bạn muốn tồn tại hoặc hoàn nguyên các thay đổi này (như bạn đang tạo một trình thiết kế biểu mẫu tùy chỉnh, ứng dụng khách của bạn có thể sử dụng để tùy chỉnh bố cục cửa sổ), bạn cũng sẽ cần có khả năng chụp nhanh một số kiểu trước và sau các điều khiển.

0

Đây là phương pháp tiện ích mở rộng mà bạn có thể sử dụng cho bất kỳ kiểm soát nào. Nó sử dụng Rx và dựa trên bài đăng A Brief Introduction to the Reactive Extensions for .NET, Rx và mẫu của Wes Dyer.

public static class FormExtensions 
{ 
    public static void EnableDragging(this Control c) 
    { 
     // Long way, but strongly typed.   
     var downs = 
      from down in Observable.FromEvent<MouseEventHandler, MouseEventArgs>(
       eh => new MouseEventHandler(eh), 
       eh => c.MouseDown += eh, 
       eh => c.MouseDown -= eh) 
      select new { down.EventArgs.X, down.EventArgs.Y }; 

     // Short way.   
     var moves = from move in Observable.FromEvent<MouseEventArgs>(c, "MouseMove") 
        select new { move.EventArgs.X, move.EventArgs.Y }; 

     var ups = Observable.FromEvent<MouseEventArgs>(c, "MouseUp"); 

     var drags = from down in downs 
        from move in moves.TakeUntil(ups) 
        select new Point { X = move.X - down.X, Y = move.Y - down.Y }; 

     drags.Subscribe(drag => c.SetBounds(c.Location.X + drag.X, c.Location.Y + drag.Y, 0, 0, BoundsSpecified.Location)); 
    } 
} 

Cách sử dụng:

nút button1 = new Button();

button1.EnableDragging();

0

Vâng, trong tất cả sự trung thực, có một cách đơn giản hơn khi bạn khởi tạo biến boolean toàn cục được gọi là bất cứ điều gì bạn thích, trong trường hợp này là isMouseClicked. Trên điều khiển của bạn, bạn muốn cho phép kéo bạn đi tới sự kiện thả xuống của nó,

Đảm bảo sự kiện này là sự kiện kiểm soát của bạn chứ không phải sự kiện biểu mẫu của bạn.

if (e.button == MouseButtons.left) 
    //this is where you set the boolean to true 

Sau đó đi để nó sự kiện chuột di chuyển

if (isMouseClicked == true) 
    //You then set your location of your control. See below: 
    Button1.Location = new Point(MousePosition.X, MousePosition.Y); 

On chuột lên chắc chắn để thiết lập của bạn isMouseClicked-false;

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