该程序没有使用API函数.....只是简单为了学习一些知识点...
实现原理:在窗体加载时截取整个屏幕保存为图片,在监视鼠标的事件,鼠标左键拖拉一个矩形框,获取此时
矩形框的左上角坐标和右下角坐标, 这2个坐标即可为要抠取的图片定位,然后使用Clone方法截取指定图片,
并且将该图片复制到粘贴板就OK了。 设置一个窗体,加载时将窗体边框设置为FormBorderStyle.None,并且将
窗体最大化,且不再任务栏显示图标,设置不透明程度 自定义(默认值为1.0),并且在此时截取整个图片。
然后监视鼠标按下的事件:在该事件中获取起始点的坐标,
再监视鼠标按键放开的事件, 在该事件中获取鼠标放开的坐标,并在此时从最初截取的图片中抠取刚才2个坐
标组成的矩形框范围图片,并保存到粘贴板中即可。
在监视鼠标的移动事件,在该事件中动态获取高和宽,并用当前屏幕的画板使用指定画刷来填充鼠标拖拉的矩
形范围框。使得用户可以看到自己的截取范围。
以下为详细代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
namespace CutScreen
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static int x = 0;
static int y = 0;
static int nowX = 0;
static int nowY = 0;
static bool isMouseClick = false;
static Graphics g;
static int width = 0;
static int height = 0;
// static Graphics gi;
static Bitmap bmp;
static string filename="1.jpg";
static bool isOneDown = true;
static Bitmap bm;
private void btnCut_Click(object sender, EventArgs e)
{
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (isOneDown)
{
x = MousePosition.X;
y = MousePosition.Y;
isMouseClick = true;
isOneDown = false;
}
// MessageBox.Show(MousePosition.X.ToString() + "" + MousePosition.Y.ToString());
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
if (isMouseClick)
{
// MessageBox.Show("放开后鼠标的位置:"+MousePosition.X.ToString() + "" + MousePosition.Y.ToString());
nowX = MousePosition.X + 1;
nowY = MousePosition.Y + 1;
Image newImage = Image.FromFile("1.jpg");
Rectangle destRect = new Rectangle(x, y, nowX - x, nowY - y);
bmp = new Bitmap(nowX - x, nowY - y);
bm = ((Bitmap)newImage).Clone(destRect, newImage.PixelFormat);
bm.Save("temp.jpg");
newImage.Dispose();
isMouseClick = false;
}
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseClick)
{
width = Math.Abs(MousePosition.X - x);
height = Math.Abs(MousePosition.Y - y);
g = CreateGraphics();
g.Clear(BackColor);
g.FillRectangle(Brushes.Navy, x < MousePosition.X ? x : MousePosition.X, y
< MousePosition.Y ? y : MousePosition.Y, width + 1, height + 1);
}
}
private void Form1_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.Close();
Application.Exit();
}
private void Form1_Load(object sender, EventArgs e)
{
Size size = Screen.PrimaryScreen.Bounds.Size;
Bitmap bmp = new Bitmap(size.Width, size.Height);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(0, 0, 0, 0, size);
//filename = DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss") + ".jpg";
//注意以下顺序。
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
this.ShowInTaskbar = false;
bmp.Save(filename, ImageFormat.Jpeg);
g = this.CreateGraphics();
this.Opacity = 0.5;
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Clipboard.SetImage(bm);//将图片保存到粘贴板,不保存实际文件。
bm.Dispose();
File.Delete("temp.jpg");
File.Delete("1.jpg");
}
}
}