Советы по созданию простого и эффективного перетаскиваемого control в Windows Forms
Если вы создаете приложение на основе Windows Forms, вы можете столкнуться с необходимостью создания control, который можно перемещать при помощи мыши. Например, вам может понадобиться реализовать функционал изменения размеров окна или перемещения элемента формы. Эта статья предоставит вам простой подход к созданию перетаскиваемого control.
Создание перетаскиваемого control начинается с определения значения свойства «Draggable» элемента. Создайте новый класс, наследующий от нужного вам control и добавьте к нему новое свойство «Draggable», а также переопределите методы OnMouseDown, OnMouseMove и OnMouseUp для обработки событий, связанных с перемещением control.
private bool _draggable;
private Point _mouseStartPoint;
public bool Draggable
{
get { return _draggable; }
set { _draggable = value; }
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (Draggable && e.Button == MouseButtons.Left)
{
_mouseStartPoint = new Point(e.X, e.Y);
}
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (Draggable && e.Button == MouseButtons.Left)
{
int left = this.Left + e.X — _mouseStartPoint.X;
int top = this.Top + e.Y — _mouseStartPoint.Y;
this.Location = new Point(left, top);
}
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
_mouseStartPoint = Point.Empty;
}
Когда вы устанавливаете свойство «Draggable» в true, control начинает реагировать на события, связанные с перемещением мыши. В методе OnMouseDown вы сохраняете текущее положение мыши в момент, когда пользователь начинает перемещение. При каждом движении мыши метод OnMouseMove вычисляет новые значения координат left и top, которые используются для изменения положения control. Метод OnMouseUp вызывается, когда пользователь заканчивает перемещение мыши, и сбрасывает временные значения.
Хотя этот простой подход может оказаться достаточным для простейших control, если у вас есть множество подобных элементов в вашем приложении, может оказаться полезным создать базовый класс, который реализует эту функциональность, чтобы не дублировать код.
В заключение, если вам нужно создать control, который можно перемещать при помощи мыши, результат может быть достаточно простым при помощи базовых настроек событий и добавления специального свойства. Используйте этот подход, чтобы упростить разработку и добавить интуитивный пользовательский интерфейс к вашему приложению.