2012-10-01 2 views
2

Есть ли способ рисовать прямоугольник с начальными и конечными точками вместо начальной точки и области ?. Я использую следующий код, чтобы нарисовать прямоугольник на форме с помощью мыши:Нарисуйте прямоугольник с помощью мыши

System.Drawing.Graphics formGraphics; 
    bool isDown = false; 
    int initialX; 
    int initialY; 

    private void Form1_MouseDown(object sender, MouseEventArgs e) 
    { 
     isDown = true; 
     initialX = e.X; 
     initialY = e.Y; 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (isDown == true) 
     { 
      this.Refresh(); 
      Pen drwaPen = new Pen(Color.Navy,1); 
      int width = e.X - initialX, height = e.Y - initialY; 
      //if (Math.Sign (width) == -1) width = width 
      //Rectangle rect = new Rectangle(initialPt.X, initialPt.Y, Cursor.Position.X - initialPt.X, Cursor.Position.Y - initialPt.Y); 
      Rectangle rect = new Rectangle(initialX, initialY, width * Math.Sign(width), height * Math.Sign(height)); 

      formGraphics = this.CreateGraphics(); 
      formGraphics.DrawRectangle(drwaPen, rect); 
     } 
    } 
    private void Form1_MouseUp(object sender, MouseEventArgs e) 
    { 
     isDown = false; 
    } 

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

+1

Вы должны делать свою картину в 'OnPaint' и просто' Invalidate' область формы, которая должна быть перерисована в событии 'MouseMove'. Это остановит мерцание, которое вы испытываете. – Jamiec

ответ

6

Как упоминалось Jamiec, просто позвоните Invalidate в MouseMove обработчика, и сделать рисунок в OnPaint метод/Paint обработчик события

Чтобы сделать правильные вперед прямоугольник или назад, попробуйте следующее:

Rectangle rect = new Rectangle(Math.Min(e.X, initialX), 
           Math.Min(e.Y, initialY), 
           Math.Abs(e.X - initialX), 
           Math.Abs(e.Y - initialY)); 
+0

Yup, проверил это, и он отлично работает. Лучше, чем просто беспристрастно Недействительность всей формы, просто аннулируйте прямоугольник. – Jamiec

+0

Да; это прекрасно работает. +1 –

0

Этот код позволяет пользователю рисовать прямоугольник или эллипс на форме с начальными и конечными точками с помощью мыши. Форма содержит только поле со списком.

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace FormsTestBed1 
{ 
    public partial class Form1 : Form 
    { 
     int _pressedLocationX; 
     int _pressedLocationY; 
     int _releasedLocationX; 
     int _releasedLocationY; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_MouseDown(object sender, MouseEventArgs e) 
     { 
      _pressedLocationX = e.X; 
      _pressedLocationY = e.Y; 
     } 

     private void Form1_MouseUp(object sender, MouseEventArgs e) 
     { 
      _releasedLocationX = e.X; 
      _releasedLocationY = e.Y; 

      using (Graphics graphics = base.CreateGraphics()) 
      using (SolidBrush solidbrush = new SolidBrush(Color.Magenta)) 
      using (Pen pen = new Pen(Color.DarkRed)) 
      { 
       graphics.Clear(SystemColors.Control); 

       switch (comboBox1.SelectedItem.ToString()) 
       { 
        case "Filled Square": 
         graphics.FillRectangle(solidbrush, 
          Math.Min(_pressedLocationX, _releasedLocationX), // Left 
          Math.Min(_pressedLocationY, _releasedLocationY), // Top 
          Math.Abs(_releasedLocationX - _pressedLocationX), // Width 
          Math.Abs(_releasedLocationY - _pressedLocationY)); // Height 
         break; 

        case "Filled Circle": 
         graphics.FillEllipse(solidbrush, 
          Math.Min(_pressedLocationX, _releasedLocationX), // Left 
          Math.Min(_pressedLocationY, _releasedLocationY), // Top 
          Math.Abs(_releasedLocationX - _pressedLocationX), // Width 
          Math.Abs(_releasedLocationY - _pressedLocationY)); // Height 
         break; 

        case "Line Square": 
         graphics.DrawRectangle(pen, 
          Math.Min(_pressedLocationX, _releasedLocationX), // Left 
          Math.Min(_pressedLocationY, _releasedLocationY), // Top 
          Math.Abs(_releasedLocationX - _pressedLocationX), // Width 
          Math.Abs(_releasedLocationY - _pressedLocationY)); // Height 
         break; 

        case "Line Circle": 
         graphics.DrawEllipse(pen, 
          Math.Min(_pressedLocationX, _releasedLocationX), // Left 
          Math.Min(_pressedLocationY, _releasedLocationY), // Top 
          Math.Abs(_releasedLocationX - _pressedLocationX), // Width 
          Math.Abs(_releasedLocationY - _pressedLocationY)); // Height 
         break; 
       } 
      } 
     } 
    } 
} 
+0

Хотя этот фрагмент кода приветствуется и может оказать некоторую помощь, было бы [значительно улучшено, если бы оно включало объяснение] (// meta.stackexchange.com/q/114762) из ​​* how * и * why * this решает проблему. Помните, что вы отвечаете на вопрос читателей в будущем, а не только на человека, который спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, и укажите, какие ограничения и допущения применяются. –

Смежные вопросы