2010-10-05 4 views
2

Мой текущий код позволяет мне рисовать прямоугольники с определенного пользователем места, но не так, как хотелось бы. Мне нужно, чтобы это было как бы вы это сделали в краске, вот мой текущий код:Нарисуйте прямоугольник, определяемый пользователем

имен SimpleDraw2 { /// /// Описание MainForm. /// public partial class MainForm: Форма { bool IsMouseDown = false; Point MousePosition; int DrawShape = 0; Bitmap StoredImage;

public MainForm() 
    { 
     // 
     // The InitializeComponent() call is required for Windows Forms designer support. 
     // 
     InitializeComponent(); 

     // 
     // TODO: Add constructor code after the InitializeComponent() call. 
     // 
     pictureBox1.Image = new Bitmap (pictureBox1.Width,pictureBox1.Height);      
     StoredImage = new Bitmap(pictureBox1.Width,pictureBox1.Height); 
    } 

    void PictureBox1MouseDown(object sender, MouseEventArgs e) 
    { 
     IsMouseDown = true; 
     MousePosition = e.Location; 
     Graphics gStored = Graphics.FromImage(StoredImage); 
     gStored.Clear(Color.Transparent); 
     gStored.DrawImage(pictureBox1.Image, 0, 0); 
    } 

    void PictureBox1MouseUp(object sender, MouseEventArgs e) 
    { 
     IsMouseDown = false; 
    } 

    void PictureBox1MouseMove(object sender, MouseEventArgs e) 
    { 
     Graphics g = Graphics.FromImage(pictureBox1.Image); 
     if (DrawShape == 0) 
     { 
      Pen p = new Pen(Color.Red, 10); 
      if (IsMouseDown) 
      { 
       g.DrawLine(p,MousePosition,e.Location); 
       MousePosition = e.Location; 
      } 
     } 
     if (DrawShape == 1) 
     { 
      g.Clear(Color.Transparent); 
      g.DrawImage(StoredImage,0,0); 
      g.DrawRectangle(Pens.Green,MousePosition.X,MousePosition.Y,e.X,e.Y); 

     } 
     if (DrawShape == 2) 
     { 
      g.Clear(Color.Transparent); 
      g.DrawImage(StoredImage, 0, 0); 
      g.DrawEllipse(Pens.HotPink, MousePosition.X, MousePosition.Y, e.X, e.Y); 
     } 
     if (DrawShape == 3) 
     { 
      g.Clear(Color.Transparent); 
      g.DrawImage(StoredImage, 0, 0); 
      g.DrawArc(Pens.Indigo,pictureBox1.Bounds, e.Y, e.X); 
     } 
     //if (DrawShape == 4) 
     //{ 
     // g.Clear(Color.Transparent); 
     // g.DrawImage(StoredImage, 0, 0); 
     // g.DrawPolygon(Pens.Indigo, Point[] e.X); 
     //} 

     this.Refresh(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog ofd = new OpenFileDialog(); 
     if (ofd.ShowDialog() == DialogResult.OK) 
     { 
      axWindowsMediaPlayer1.URL = ofd.FileName; 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     axWindowsMediaPlayer1.Ctlcontrols.pause(); 
     Bitmap bmp = new Bitmap(axWindowsMediaPlayer1.Width, axWindowsMediaPlayer1.Height); 
     Graphics gfx = Graphics.FromImage(bmp); 
     gfx.CopyFromScreen(PointToScreen(axWindowsMediaPlayer1.Location), new Point(0, 0), axWindowsMediaPlayer1.Bounds.Size, CopyPixelOperation.SourceCopy); 
     pictureBox1.BackgroundImage = bmp; 
     //axWindowsMediaPlayer1.Visible = false; 
     //pictureBox1.Visible = true; 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     Graphics gg = Graphics.FromImage(pictureBox1.BackgroundImage); 
     gg.Clear(Color.Transparent); 
     Graphics gStored = Graphics.FromImage(StoredImage); 
     gStored.Clear(Color.Transparent); 
     Graphics g = Graphics.FromImage(pictureBox1.Image); 
     g.Clear(Color.Transparent); 


    } 

    private void button4_Click(object sender, EventArgs e) 
    { 
     DrawShape = 1; 

    } 

    private void button6_Click(object sender, EventArgs e) 
    { 
     DrawShape = 2; 
    } 

    private void button8_Click(object sender, EventArgs e) 
    { 
     DrawShape = 3; 
    } 

    private void button7_Click(object sender, EventArgs e) 
    { 
     DrawShape = 0; 
    } 
} 

}

Если кто-то может помочь мне изменить мой код, чтобы сглаживать вопрос, чтобы сделать его легко перетащить и сделать систему было бы мне очень признателен.

Заранее спасибо

Крис

ответ

2

От msdn:

рисует прямоугольник, заданный в парой координат, шириной и высотой .

Так что ваш код не будет работать:

g.DrawRectangle(Pens.Green,MousePosition.X,MousePosition.Y,e.X,e.Y); 

Должно быть что-то вроде

g.DrawRectangle(Pens.Green, MousePosition.X, MousePosition.Y, Math.Abs(e.X - MousePosition.X), Math.Abs(e.Y - MousePosition.Y)); 
+0

Та же проблема все еще возникает, она сохраняет последнее местоположение и рисует квадрат из коннектора, где он в последний раз оставался в окне изображения. –

1

Самая большая проблема, которую я вижу, что вы пытаетесь сделать в событиях мыши. Это означает, что ваш рисунок будет уничтожен в тот момент, когда вы получите событие обновления.

Только рисуйте события Paint, никогда в событиях мыши. Если вы хотите, чтобы ваше приложение рисовало в результате событий мыши, установите точку, прямоугольник или что-то еще в событиях мыши (например, вы начинаете делать с IsMouseDown), аннулируйте область, которую вы хотите изменить в событии MouseMoved, затем нарисуйте ваш прямоугольник или что-то еще в вашем событии Paint.

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