GDI+屏幕截图
2015-08-24 15:19
477 查看
很简陋的一个屏幕截图工具,支持任意尺寸。
效果图如下:
FullFrom是一个子窗体,当点击主窗体的截图按钮时,先从GDI+获取整个屏幕截图,传递 给FullForm,然后再将FullForm全屏最大化显示。
目前只支持单屏幕,多个屏幕未考虑。代码写的比较乱,注重功能实现。后续可以用钩子捕获全局系统按键。如ctrl+alt+a,捕获这三个按键进行截图。
主窗体代码如下:
效果图如下:
FullFrom是一个子窗体,当点击主窗体的截图按钮时,先从GDI+获取整个屏幕截图,传递 给FullForm,然后再将FullForm全屏最大化显示。
目前只支持单屏幕,多个屏幕未考虑。代码写的比较乱,注重功能实现。后续可以用钩子捕获全局系统按键。如ctrl+alt+a,捕获这三个按键进行截图。
public partial class FullScreen : Form { Image Img; public FullScreen(Image img) { InitializeComponent(); Img = img; this.KeyPreview = true;//窗体接受控件的KEY事件 } Screen c = Screen.PrimaryScreen; private void FullScreen_Load(object sender, EventArgs e) { this.TopMost = true; this.FormBorderStyle = FormBorderStyle.None; this.WindowState = FormWindowState.Maximized; pictureBox1.BackgroundImage = Img; getX = c.Bounds.Width; getY = c.Bounds.Height; } /// <summary> /// 鼠标左键是否按下 /// </summary> bool flag_isDown = false; /// <summary> /// 鼠标左键是否抬起 /// </summary> bool flag_isUp = false; /// <summary> /// 鼠标是否移动(左键按下的情况) /// </summary> bool flag_isMove = false; Point MouseStart=new Point(); Point MouseNow = new Point(); /// <summary> /// 截取矩形的宽 /// </summary> int getX; /// <summary> /// 截取矩形的高 /// </summary> int getY; private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left)//判断是否是鼠标左键 { flag_isMove = false;//若鼠标左键按下,则该标志位为false MouseStart = new Point(e.X, e.Y);//记录鼠标左键按下的位置 MouseNow = new System.Drawing.Point(0, 0);//清理 flag_isDown = true;//鼠标按下标志置为true flag_isUp = false;//鼠标抬起标志置为false } } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (flag_isDown && !flag_isUp)//左键按下且未抬起 { MouseNow = new Point(e.X, e.Y); getX = MouseNow.X - MouseStart.X; getY = MouseNow.Y - MouseStart.Y; flag_isMove = true; pictureBox1.Refresh(); } } } private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; //设置高质量插值法 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量,低速度呈现平滑程度 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; if (flag_isMove) { Pen p = new Pen(Color.Red, 2); p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; Rectangle rect = new Rectangle(MouseStart.X, MouseStart.Y, getX, getY); g.DrawRectangle(p, rect); string temp = "请点击鼠标右键保存或退出!"; Font ft = new Font("宋体", 14, FontStyle.Bold | FontStyle.Italic); SizeF sf = g.MeasureString(temp, ft); float str_x = 0; float str_y = 0; //处理字体显示,防止越界看不到 if (getX < sf.Width) { str_x = MouseStart.X - (sf.Width - getX); } else { str_x = MouseStart.X; } if (MouseStart.Y <= 0) { str_y = MouseNow.Y + 30; } else { str_y = MouseStart.Y - 30; } g.DrawString(temp, ft, Brushes.Red, str_x, str_y); } else { Pen p = new Pen(Color.Red, 10); p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; Rectangle rect = new Rectangle(0, 0, c.Bounds.Width, c.Bounds.Height); g.DrawRectangle(p, rect); g.DrawString("点击鼠标左键并拖动或点击鼠标右键保存全屏图片!", new Font("宋体", 20, FontStyle.Bold | FontStyle.Italic), Brushes.Red, 0, 20); } } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { flag_isUp = true; flag_isDown = false; MouseNow = new Point(e.X, e.Y); pictureBox1.Refresh(); } } private void FullScreen_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Escape)//esc退出 { this.Close(); } } private void toolStripMenuItem1_Click(object sender, EventArgs e) { if ((getX) != 0 && (getY) != 0) { this.TopMost = false; //目标图大小 Bitmap b = new Bitmap(getX, getY); Graphics g = Graphics.FromImage(b); //目标图的矩形容器 Rectangle destRect = new Rectangle(0, 0, getX, getY); //在原图上所截取的矩形区域 Rectangle srcRect = new Rectangle(MouseStart.X, MouseStart.Y, getX, getY); g.DrawImage(Img, destRect, srcRect, GraphicsUnit.Pixel); FileDialog sfd = new SaveFileDialog(); sfd.Filter = "图片|*.jpg|图片|*.bmp|图片|*.png"; if (sfd.ShowDialog() == DialogResult.OK) { b.Save(sfd.FileName); this.Close(); } g.Dispose(); } } private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); } }
主窗体代码如下:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } Screen c = Screen.PrimaryScreen; Image img; FullScreen fs; private void button1_Click(object sender, EventArgs e) { this.Hide(); Thread.Sleep(100); img = CopyScreen(); fs = new FullScreen(img); fs.Focus(); fs.Activate(); fs.ShowDialog(); this.Show(); this.Activate(); this.BringToFront(); } /// <summary> /// 获得屏幕的整张截图 /// </summary> /// <returns></returns> Image CopyScreen() { Image bt = new System.Drawing.Bitmap(c.Bounds.Width, c.Bounds.Height); Graphics g = Graphics.FromImage(bt); g.CopyFromScreen(0, 0, 0, 0, c.Bounds.Size, CopyPixelOperation.SourceCopy); g.Save(); g.Dispose(); return bt; } }
相关文章推荐
- 使用crontab命令定时执行脚本
- 备考SharePoint 2010 Certification (70-668)心得
- Ubuntu14.02.2下安装JDK并配置Jetty服务器
- ReactiveCocoa与Functional Reactive Programming
- android: AAC文件解析
- 三星Galaxy Tab S2上市,压制苹果之心凸显
- snprintf 在 linux 和 windows 平台上的差别
- 使用net模块实现基于TCP的数据通信
- CSS中的绝对定位与相对定位
- 8.2.1.5 Engine Condition Pushdown Optimization 引擎优化条件推入
- Windows平台使用FFShow录制视频
- 你知道用AngularJs怎么定义指令吗?
- Android欢迎界面的创建方法
- UML类图3-用例图
- 黑马程序员--C语言指针详解
- 观察者模式 Observer
- 各种基本算法实现总结
- Java 接口和抽象类
- Java 接口和抽象类
- IOS-笔记13(Closures, Multithreading)