Недавно столкнулся с проблемой работы с drag&drop для произвольных объектов. Решил тут кратенько описать что к чему.
По настоящему всё просто. Для объектов windows forms есть реализация drag&drop(сейчас не об этом).Возьмём к примеру программу которая будет строить многоугольник.И сделаем так чтобы каждую вершину можно drag&drop'ить.
Заведём в нашем классе следующее:
- private int DDPoint; - точка которую перетаскиваем в данный момент
- private bool DragDropFlag; - флаг того что пользователь "тащит".
- List<Point> PointList = new List<Point>(); - список точек
добавление точек в многоугольник и отрисовку его писать здесь не буду.
Для начала обработаем нажатие копки(не путать с кликом,клик = нажал и отпустил)
Код:
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (PointList.Count > 1)
{
for (int i = 0; i < PointList.Count; i++) //перебираем точки
{
if (e.X <= PointList[i].x + 20 && e.X >= PointList[i].x - 20 && e.Y <= PointList[i].y + 20 && e.Y >= PointList[i].y - 20) //проверка,не нажали ли на точку
{
DDPoint = i;
DragDropFlag = true; //если да,то ставим i-ую точку как точку которую мы двигаем и возводим флаг
label1.Text = "Sex,drugs, drag and drop!"; //фетиш
}
if (DragDropFlag == true) break;
}
}
} }
Теперь рассмотрим движение мышки:
Код:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (DragDropFlag == true) //если поднят флаг
{
PointList[DDPoint].x = e.X;
PointList[DDPoint].y = e.Y; //меняем x,y нужной точки
label1.Text = "Drugs,sex drag and drop!";
Refresh(); //перерисовываем
}
else label1.Text = "Координаты: " + e.X + ";" + e.Y;
}
ну и поднятие мышки:
Код:
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
DragDropFlag = false;
}
Хочу добавить что было бы неплохо добавить Double buffering:
Код:
private void Form1_Paint(object sender, PaintEventArgs e)
{
DoubleBuffered = true;
......
Скачать исходник