GDI+屏幕截图

来源:互联网 发布:江恩九方图软件 编辑:程序博客网 时间:2024/06/10 13:04

很简陋的一个屏幕截图工具,支持任意尺寸。

 效果图如下:

 

 

 

 

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


 


 

0 0