1,目的:
- 实现类似系统截图工具那样对屏幕任何区域自定义大小的截图。
2,效果展示:
3,代码:
public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){this.WindowState = FormWindowState.Minimized;//获取屏幕截屏Bitmap bcgImg = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);using (Graphics g= Graphics.FromImage(bcgImg)){g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(bcgImg.Width, bcgImg.Height));}//将图片传给截图窗口CaptureFrm frm = new CaptureFrm(bcgImg);frm.TopMost = true;if( frm.ShowDialog()== DialogResult.OK){MessageBox.Show("截图已保存至剪贴板,请选择合适的载体进行粘贴!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}else{MessageBox.Show("取消截图","提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);}this.WindowState = FormWindowState.Normal;}}
public partial class CaptureFrm : Form{Bitmap bcgImg;bool drawingFlag=false;Point startPoint;Point endPoint;Graphics main_g;bool isCapture=false;public CaptureFrm(Bitmap img){InitializeComponent();bcgImg = img;}private void CaptureFrm_Load(object sender, EventArgs e){//背景this.BackgroundImage = bcgImg;this.BackgroundImageLayout = ImageLayout.Stretch;}private void CaptureFrm_KeyDown(object sender, KeyEventArgs e){//如果按下ESC键则退出if (e.KeyCode == Keys.Escape){// this.Close();DialogResult = DialogResult.Cancel;}}private void CaptureFrm_MouseDown(object sender, MouseEventArgs e){if(e.Button== MouseButtons.Left){drawingFlag = true;startPoint = e.Location;main_g = this.CreateGraphics();}if(e.Button== MouseButtons.Right){if (isCapture){Bitmap map = new Bitmap(width, height);Bitmap source = new Bitmap(bcgImg, new Size(this.Width, this.Height));using (Graphics g = Graphics.FromImage(map)){g.DrawImage(source, new Rectangle(0, 0, map.Width, map.Height), new Rectangle(recX, recY, width, height), GraphicsUnit.Pixel);}Clipboard.SetImage(map);main_g.Dispose();DialogResult = DialogResult.OK;isCapture = false;}}}private void CaptureFrm_MouseUp(object sender, MouseEventArgs e){if(e.Button== MouseButtons.Left){//进行最终边界确认endPoint = e.Location;drawingFlag = false;isCapture = true;}}int recX, recY, width, height;private void CaptureFrm_MouseMove(object sender, MouseEventArgs e){if (!drawingFlag ||main_g==null) return;width = Math.Abs(startPoint.X - e.X);height = Math.Abs(startPoint.Y - e.Y);if (startPoint.X < e.X){recX = startPoint.X;}else{recX = startPoint.X-width;}if (startPoint.Y < e.Y){recY = startPoint.Y;}else{recY = startPoint.Y-height;}CaptureFrm_Paint(null, null);Pen pen = new Pen(Color.Green, 2);pen.DashPattern = new float[] { 1, 2 };pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;main_g.DrawRectangle(pen, recX, recY, width, height);string ss = $"X:{recX},Y:{recY}\n width:{width},height:{height}";main_g.DrawString(ss, new Font("宋体", 12,FontStyle.Bold), Brushes.Red, new Point(10, 10));}private void CaptureFrm_Paint(object sender, PaintEventArgs e){if (main_g == null) return;// main_g.Clear(Color.WhiteSmoke);main_g.DrawImage(bcgImg, new Rectangle(0, 0, this.Width, this.Height), new Rectangle(0, 0, bcgImg.Width, bcgImg.Height), GraphicsUnit.Pixel);}private void CaptureFrm_DoubleClick(object sender, EventArgs e){}}