Показать сообщение отдельно

  #15  
Старый 23.11.2008, 00:03
scrat
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
С нами: 10048706

Репутация: 1540


По умолчанию

Недавно столкнулся с проблемой работы с 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;
     ......
Скачать исходник
 
Ответить с цитированием