Как разрешить пользователю перетаскивать динамически созданный элемент управления по месту его выбора

Я создаю приложение, где мне нужно генерировать динамически созданные элементы управления, например текстовое поле или ярлык и т.д.

Теперь, что я, этот пользователь, может переместить этот текстовый ящик в нужное место. Как и в Visual Studio. Один из способов - получить новое местоположение, получая от него значения с помощью текстового поля. Но я хочу, чтобы пользовательский интерфейс был простым.

Можем ли мы иметь такую ​​функциональность в winforms

Ответ 1

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

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

Ответ 2

Вы можете вызвать DoDragDrop с объектом данных, содержащим или представляющим элемент управления, для начала операции перетаскивания и удаления, затем обработать событие контейнера DragDrop и переместить элемент управления.

Если вы хотите увидеть элемент управления по мере его перетаскивания, вы можете сделать прозрачную (дескриптор WM_NCHITTEST) форму под мышью, показывая элемент управления (вызов DrawToBitmap), или вообще не использовать drag & drop обрабатывать события мыши и отслеживать состояние вручную.

Если вы хотите оснастки стиля Visual Studio, вы можете сравнить границы управления с другими элементами управления, сделать набор строк для рисования и нарисовать их в событии рисования.