Как разрешить пользователю перемещать элемент управления в форме - PullRequest
7 голосов
/ 23 сентября 2010

У меня есть winform, на котором я хочу разрешить пользователю перемещать элемент управления.

Элемент управления (на данный момент) - вертикальная линия: метка с рамкой и шириной 1.

Контекст не очень важен, но я все равно дам его вам.У меня есть фон с некоторой графикой, и я хотел бы, чтобы пользователь мог скользить над графикой.Графика сделана с помощью библиотеки NPlots.Это выглядит примерно так: http://www.ibme.de/pictures/xtm-window-graphic-ramp-signals.png

Если я смогу узнать, как пользователь может щелкнуть и перетащить элемент управления меткой / линией по экрану, я смогу решить мою проблему с указаниями.Пожалуйста, помогите.

Ответы [ 5 ]

9 голосов
/ 23 сентября 2010

Код для этого может быть немного сложным, но по сути вам нужно будет захватывать события MouseDown, MouseMove и MouseUp в вашей форме.Как то так:

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
    }
}
3 голосов
/ 23 сентября 2010

В WinForms вы можете обрабатывать события MouseDown, MouseMove и MouseUp элемента управления.На MouseDown установите бит или ссылку, сообщающую вашей форме, на каком элементе управления была нажата мышь, и захватывайте X и Y мыши из MouseEventArgs.В MouseMove, если элемент управления установлен, настройте его X и Y на разницу между последними захваченными X и Y и текущими координатами.В MouseUp отпустите элемент управления.

Я бы настроил для этого «режим редактирования»;когда пользователь входит в этот режим, текущие обработчики событий элементов управления вашей формы должны быть отсоединены, а обработчики движения присоединены.Если вы хотите сохранить или отменить эти изменения (например, вы создаете собственный конструктор форм, который ваш клиент может использовать для настройки макетов окон), вам также понадобится сделать некоторый снимок макетов до и послеэлементы управления.

2 голосов
/ 23 сентября 2010

Я написал компонент, чтобы сделать именно это: переместить элемент управления в форме (или переместить форму без полей на экране).Вы даже можете использовать его от дизайнера, без написания кода.

http://www.thomaslevesque.com/2009/05/06/windows-forms-automatically-drag-and-drop-controls-dragmove/

0 голосов
/ 04 августа 2012

Честно говоря, существует более простой способ, при котором вы инициализируете глобальную логическую переменную, которая называется как угодно, в данном случае isMouseClicked. На вашем контроле вы хотите разрешить перетаскивание вы идете на событие мыши вниз,

Убедитесь, что эти события являются вашими управляющими событиями, а не событием форм.

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

Затем перейдите к событию перемещения мыши

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

При включении мыши обязательно установите isMouseClicked на false;

0 голосов
/ 23 сентября 2010

Вот метод расширения, который вы можете использовать для любого элемента управления. Он использует Rx и основан на Краткое введение в Реактивные расширения для .NET, Rx и пример Уэса Дайера.

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));
    }
}

Использование:

Кнопка button1 = новая кнопка ();

button1.EnableDragging ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...