/// <summary> /// 按下左键后移动鼠标,标记截图区域 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Cutter_MouseMove(object sender, MouseEventArgs e) { // 确保截图开始 if (Is_CatchStart) { // 新建一个图片对象,让它与屏幕图片相同 Bitmap copyBmp = (Bitmap)WinBmp.Clone(); // 获取鼠标按下的坐标 Point newPoint = new Point(DownPonint.X, DownPonint.Y); // 新建画板和画笔 Graphics g = Graphics.FromImage(copyBmp); Pen p = new Pen(Color.Red, 1); // 获取矩形的长宽 int width = Math.Abs(e.X - DownPonint.X); int height = Math.Abs(e.Y - DownPonint.Y); if (e.X < DownPonint.X) { newPoint.X = e.X; } if (e.Y < DownPonint.Y) { newPoint.Y = e.Y; } CatchRectangle = new Rectangle(newPoint, new Size(width, height)); // 将矩形画在画板上 g.DrawRectangle(p, CatchRectangle); // 释放目前的画板 g.Dispose(); p.Dispose(); // 从当前窗体创建新的画板 Graphics g1 = this.CreateGraphics(); // 将刚才所画的图片画到截图窗体上 // 为什么不直接在当前窗体画图呢? // 如果自己解决将矩形画在窗体上,会造成图片抖动并且有无数个矩形 // 这样实现也属于二次缓冲技术 g1.DrawImage(copyBmp, new Point(0, 0)); g1.Dispose(); // 释放拷贝图片,防止内存被大量消耗 copyBmp.Dispose(); } }