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)
{
}
}