2024年2月6日发(作者:)

程序功能:

1. 截取整个屏幕并保存

2. 新 开 一个全屏窗口 , 将保存的屏幕作 为 背景

3. 鼠 标 拖 动 改 变 截取范 围 , 右 键 取消

4. 双 击 截取 , 保存在粘 贴 板 , 全屏窗口 关闭

好了 , 下面的是代 码 部分

首先新建一个 项 目 ScreenCutter(VS2005,将窗体名改 为 MainForm, 再新建一个窗体 ScreenBody. 添加一个按 钮 btnCutter 到 ScreenCutter 并添加按 钮 事件 :

private void btnCutter_Click(object sender, EventArgs e

{

Image img = new Bitmap(eens[0].,

eens[0].;

Graphics g = age(img;

omScreen(new Point(0, 0, new Point(0, 0,

eens[0].;

ScreenBody body = new ScreenBody(;

oundImage = img;

(;

}

eens[0]是 获 取当前所有 设备 窗口的第一个 , 我 这 里只有一个

显 示器 , 当然我就是第一个 . 利用 Graphics 的 CopyFromScreen 函数 获 取当前屏幕 .

好了 , 现 在按下按 钮 全屏窗口就会出来了 .

下面 讲 全屏窗口 ScreenBody, 首先 设 置窗体的 FormBorderStyle 为 None, 然后声明以下 变 量 private Graphics MainPainter; //主画笔

private Pen pen; //就是笔咯

private bool isDowned; //判断鼠 标 是否按下

private bool RectReady; //矩形是否 绘 制完成

private Image baseImage; //基本 图 形 (原来的画面

private Rectangle Rect; //就是要保存的矩形

private Point downPoint; //鼠 标 按下的点

int tmpx;

int tmpy;

之后就是窗体的鼠 标 函数了 , 里面很多代 码 都没有作出整理 , 看了一下 , 整理后的代 码应该 会更少更精 简 的

private void ScreenBody_DoubleClick(object sender, EventArgs e

{

if ((( ==

&&ns(((MouseEventArgse.X, ((MouseEventArgse.Y

{

//保存的 时 候有很多 种 方法的 ...... 我 这 里只用了 这种

Image memory = new Bitmap(, ;

Graphics g = age(memory;

omScreen(Rect.X + 1, Rect.Y + 1, 0, 0, ;

ge(memory;

this .Close(;

}

}

private void ScreenBody_MouseDown(object sender, MouseEventArgs e {

if ( ==

{

isDowned = true ;

if (RectReady == false

{

Rect.X = e.X;

Rect.Y = e.Y;

downPoint = new Point(e.X, e.Y;

}

if (RectReady == true

{

tmpx = e.X;

tmpy = e.Y;

}

}

if ( ==

{

if (RectReady != true

{

this .Close(;

return ;

}

age(baseImage, 0, 0;

RectReady = false ;

}

}

private void ScreenBody_MouseUp(object sender, MouseEventArgs e {

if ( ==

{

isDowned = false ;

RectReady = true ;

}

}

private void ScreenBody_MouseMove(object sender, MouseEventArgs e

{

if (RectReady == false

{

if (isDowned == true

{

Image New = DrawScreen(((, e.X, e.Y;

age(New, 0, 0;

e(;

}

}

if (RectReady == true

{

if (ns(e.X, e.Y

{

// = ;

if (isDowned == true

{

//和上一次的位置比 较获 取偏移量

Rect.X = Rect.X + e.X - tmpx;

Rect.Y = Rect.Y + e.Y - tmpy;

//记录现 在的位置

tmpx = e.X;

tmpy = e.Y;

MoveRect(((, Rect; } } } } private void

ScreenBody_Load(object sender, EventArgs e { State =

zed; MainPainter = Graphics(; pen = new

Pen(; isDowned = false; baseImage = oundImage; Rect = new

Rectangle(; RectReady = false; } 辅助函数 本来应该写更多的辅助函数的,将窗体响应函数里面的代码放到里面来,不过本人很懒,就这样将就了.呵呵 private void

DrawRect(Graphics Painter, int Mouse_x, int Mouse_y {

int width = 0; int heigth = 0; if (Mouse_y < Rect.Y { Rect.Y = Mouse_y; heigth =

downPoint.Y - Mouse_y; } else { heigth = Mouse_y - downPoint.Y; } if (Mouse_x <

Rect.X { Rect.X = Mouse_x; width = downPoint.X - Mouse_x; } else { width = Mouse_x

- downPoint.X; } = new Size(width, heigth; ctangle(pen, Rect; }

private Image DrawScreen(Image back, int Mouse_x, int Mouse_y { Graphics

Painter = age(back; DrawRect(Painter, Mouse_x, Mouse_y; return

back; } private void MoveRect(Image image, Rectangle Rect { Graphics Painter =

age(image; ctangle(pen, Rect.X, Rect.Y, ,

; DrawRects(Painter; age(image, 0, 0; e(; }