在pictureBox上每次只繪製一個矩形框,繪製下一個矩形框時上次繪製的矩形框取消,代碼如鏈接:https://www.cnblogs.com/luxiao/p/5625196.html 在繪製矩形框時要在程式中添加滑鼠相應的事件MouseDown、MouseUp、MouseMove、Paint。 ...
在pictureBox上每次只繪製一個矩形框,繪製下一個矩形框時上次繪製的矩形框取消,代碼如鏈接:https://www.cnblogs.com/luxiao/p/5625196.html
在繪製矩形框時要在程式中添加滑鼠相應的事件MouseDown、MouseUp、MouseMove、Paint。
繪製矩形框的代碼如下:
1 Point start, end;//繪製矩形框的起點和終點 2 bool blnDraw;//在MouseMove事件中判斷是否繪製矩形框 3 public struct StartAndEndPoint 4 { 5 Point Start; 6 Point End; 7 } 8 //繪製矩形起始點和終止點的集合 9 List<StartAndEndPoint> multiAreaPoint=new List<StartAndEndPoint>(); 10 11 private void pic_MouseDown(object sender, MouseEventArgs e) 12 { 13 if (e.Button == MouseButtons.Left) 14 { 15 start = e.Location; 16 blnDraw = true; 17 } 18 // 點擊滑鼠右鍵繪製整個pictureBox區域 19 if (e.Button == MouseButtons.Right) 20 { 21 start = new Point(0, 0); 22 } 23 } 24 25 private void pic_MouseUp(object sender, MouseEventArgs e) 26 { 27 PictureBox pic = sender as PictureBox; 28 29 if (e.Button == MouseButtons.Left) 30 { 31 end = e.Location; 32 blnDraw = false; 33 } 34 if (e.Button == MouseButtons.Right) 35 { 36 end = new Point(pic.Width, pic.Height); 37 } 38 39 40 if (pic.Image != null) 41 { 42 if (start != end) 43 { 44 StartAndEndPoint onepoint = new StartAndEndPoint(); 45 onepoint.start = start; 46 onepoint.end = end; 47 48 if ((!multiAreaPoint.Contains(onepoint))) 49 { 50 multiAreaPoint.Add(onepoint);//添加不同區域起始和終止點的結構體數組 51 } 52 } 53 } 54 55 //pic.Refresh(); 56 } 57 58 private void pic_MouseMove(object sender, MouseEventArgs e) 59 { 60 if (blnDraw) 61 { 62 if (e.Button != MouseButtons.Left)//判斷是否按下左鍵 63 return; 64 end = e.Location; 65 pic.Invalidate(); 66 } 67 }
1 private void pic_Paint(object sender, PaintEventArgs e) 2 { 3 PictureBox pic = sender as PictureBox; 4 5 Pen pen = new Pen(Color.Red, 1); 6 pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;//繪製線的格式 7 if (blnDraw) 8 { 9 if (pic.Image != null) 10 { 11 //此處是為了在繪製時可以由上向下繪製,也可以由下向上繪製 12 e.Graphics.DrawRectangle(pen, Math.Min(start.X, end.X), Math.Min(start.Y, end.Y), Math.Abs(start.X - end.X), Math.Abs(start.Y - end.Y)); 13 } 14 } 15 16 //將之前繪製的矩形框再次繪製一遍 17 foreach (StartAndEndPoint points in multiAreaPoint) 18 { 19 Point p1 = points.start; 20 Point p2 = points.end; 21 e.Graphics.DrawRectangle(pen, Math.Min(p1.X, p2.X), Math.Min(p1.Y, p2.Y), Math.Abs(p1.X - p2.X), Math.Abs(p1.Y - p2.Y)); 22 } 23 24 pen.Dispose(); 25 }
多個矩形框繪製相對於繪製單個矩形框而言不能自動取消掉上一次的繪製了,那麼如何取消繪製在pictureBox上的矩形框呢?
繪製多個矩形框的原理是將多個起始點與終止點放到數組中,在調用Paint方法時,將這些點重新繪製一遍,那麼取消繪製這些矩形就可以將數組中的點刪除掉,在調用Paint方法就可以刪除這些矩形啦!
代碼如下:
1 multiAreaPoint.Clear(); 2 pic.Refresh();
pic.Refresh();是為了調用Paint方法。
若有不同見解或其他實現方法,歡迎與我交流。