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(; }


发布评论