Как рисовать и перемещать фигуры с помощью мыши в C #

Я новичок в программировании на C # и хотел бы попросить немного помощи. В настоящее время я пытаюсь переместить заполненный цветом прямоугольник, который я рисую в форме приложения Windows с помощью левой кнопки мыши, и я пытаюсь перетащить его в другое место с помощью правой кнопки мыши. В настоящее время мне удалось нарисовать прямоугольник, но щелчок правой кнопкой мыши перетаскивает всю форму за собой.

Вот мой код:

public partial class Form1 : Form
{
    private Point MouseDownLocation;

    public Form1()
    {
        InitializeComponent();
        this.DoubleBuffered = true;
    }
    Rectangle rec = new Rectangle(0, 0, 0, 0);

    protected override void OnPaint(PaintEventArgs e)
    {   
        e.Graphics.FillRectangle(Brushes.DeepSkyBlue, rec);
    }


    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left) 
        {
            rec = new Rectangle(e.X, e.Y, 0, 0);
            Invalidate();

        }
        if (e.Button == MouseButtons.Right)
        {
            MouseDownLocation = e.Location;
        }
    }
    protected override void OnMouseMove(MouseEventArgs e)
    {             

        if (e.Button == MouseButtons.Left)
        {
            rec.Width = e.X - rec.X;
            rec.Height = e.Y - rec.Y;
            Invalidate();
        }

        if (e.Button == MouseButtons.Right)
        {
            this.Left = e.X + this.Left - MouseDownLocation.X;
            this.Top = e.Y + this.Top - MouseDownLocation.Y;

        }
    }

}

Мне нужно только перетащить прямоугольники правой кнопкой мыши.

РЕДАКТИРОВАТЬ: Благодаря вам всем я очень быстро получил свой ответ, и вот код, который работает:

public partial class Form1 : Form
{
    private Point MouseDownLocation;

    public Form1()
    {
        InitializeComponent();
        this.DoubleBuffered = true;            
    }

    Rectangle rec = new Rectangle(0, 0, 0, 0);

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.FillRectangle(Brushes.DeepSkyBlue, rec);
        //Generates the shape            
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        //can also use this one:
        //if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            rec = new Rectangle(e.X, e.Y, 0, 0);
            Invalidate();

        }
        if (e.Button == MouseButtons.Right)
        {
            MouseDownLocation = e.Location;
        }
    }
    protected override void OnMouseMove(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            rec.Width = e.X - rec.X;
            rec.Height = e.Y - rec.Y;
            this.Invalidate();
        }

        if (e.Button == MouseButtons.Right)
        {
            rec.Location = new Point((e.X - MouseDownLocation.X) + rec.Left, (e.Y - MouseDownLocation.Y) + rec.Top);
            MouseDownLocation = e.Location;
            this.Invalidate();
        }
    }

}

person User_T    schedule 12.04.2013    source источник


Ответы (2)


Кажется, это работает

    protected override void OnMouseMove(MouseEventArgs e)
    {


        if (e.Button == MouseButtons.Left)
        {
            rec.Width = e.X - rec.X;
            rec.Height = e.Y - rec.Y;
            this.Invalidate();
        }

        if (e.Button == MouseButtons.Right)
        {
            rec.Location = new Point((e.X-MouseDownLocation.X) + rec.Left, (e.Y-MouseDownLocation.Y) + rec.Top);
            MouseDownLocation = e.Location;
            this.Invalidate();
        }
    }
person PLED    schedule 12.04.2013

попробуйте это: обратите внимание, что я добавляю таймер в форму в этом методе, вам не нужно вызывать Invalidate при событии мыши, которое timertick вызывает в Refresh (), поэтому форма будет рисовать себя в каждом тике.

public partial class Form1 : Form
{
   private Point MouseDownLocation;

   public Form1()
   {
      InitializeComponent();
      this.DoubleBuffered = true;
      timer1.Start(); // add timer to the form
   }
   Rectangle rec = new Rectangle(0, 0, 0, 0);

   protected override void OnPaint(PaintEventArgs e)
   {
       e.Graphics.FillRectangle(Brushes.DeepSkyBlue, rec);
   }

   private void timer1_Tick(object sender, EventArgs e)
   {
       Refresh();
   }


  protected override void OnMouseMove(MouseEventArgs e)
  {
      if (e.Button == MouseButtons.Left)
      {
         rec.Width = e.X - rec.X;
         rec.Height = e.Y - rec.Y;
      }
      else if (e.Button == MouseButtons.Right)
      {
        rec.X = e.X - MouseDownLocation.X;
        rec.Y = e.Y - MouseDownLocation.Y;
      }
  }

   protected override void OnMouseUp(object sender, MouseEventArgs e)
   {
       if (e.Button == MouseButtons.Right)
          MouseDownLocation = e.Location;
   }
 }
person Elior    schedule 12.04.2013
comment
Поскольку я новичок в этом, я еще не использовал таймер. Кажется логичным добавить это. Но как в этом случае определить Timer1? - person User_T; 13.04.2013
comment
В WinForms перейдите в представление дизайна и перетащите элемент управления таймером в свою форму, после чего вы увидите его ниже, чтобы добавить метод timerTick, просто дважды щелкните по нему, вы можете запустить таймер, когда форма загружается или в форме c ' tor, используя timer.Start () или timer.Enabled = true, если вы хотите остановить таймер, вы можете использовать timer.Stop () или timer.Enabled = false - person Elior; 13.04.2013
comment
Я сделал все это сейчас, и программа запускается, но ничего не рисует - person User_T; 13.04.2013
comment
он ничего не рисует в начале, потому что начальная ширина и высота прямоугольника равны 0, вам нужно нажать левую кнопку и переместить мышь, чтобы изменить ширину и высоту прямоугольника, и он нарисует прямоугольник - person Elior; 13.04.2013