您的位置:首页 > 其它

GDI+屏幕截图

2015-08-24 15:19 477 查看
很简陋的一个屏幕截图工具,支持任意尺寸。

效果图如下:

















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

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: