简单截图功能实现

主窗体上一个截图按钮一个富文本框。点击截图按钮可以进行截图操作

代码如下:

public partial class MainFrm : Form
    {
        public MainFrm()
        {
            InitializeComponent();        
        }

        private void btnCatch_Click(object sender, EventArgs e)
        {
            this.Hide();//隐藏当前窗体
            System.Threading.Thread.Sleep(500);//让线程睡眠一段时间,窗体消失需要一点时间
            ScrenFrm CatchForm = new ScrenFrm();
            Bitmap CatchBmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);//新建一个和屏幕大小相同的图片    
            Graphics g = Graphics.FromImage(CatchBmp);
            g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height));//保存全屏图片
            CatchForm.BackgroundImage = CatchBmp;//将Catch窗体的背景设为全屏时的图片
            if (CatchForm.ShowDialog() == DialogResult.OK)
            {//如果Catch窗体结束,就将剪贴板中的图片放到信息发送框中
                IDataObject iData = Clipboard.GetDataObject();
                DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Bitmap);
                if (iData.GetDataPresent(DataFormats.Bitmap))
                {
                    richTextBox1.Paste(myFormat);
                    Clipboard.Clear();//清除剪贴板中的对象
                }
                this.Show();//重新显示窗体
            }
        }
    }

弹出窗体代码如下:

 public partial class ScrenFrm : Form
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;


        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }


        #region Windows Form Designer generated code


        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // ScrenFrm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(441, 315);
            this.DoubleBuffered = true;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Name = "ScrenFrm";
            this.Text = "截图";
            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
            this.Load += new System.EventHandler(this.截图_Load);
            this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.截图_MouseClick);
            this.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.截图_MouseDoubleClick);
            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.截图_MouseDown);
            this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.截图_MouseMove);
            this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.截图_MouseUp);
            this.ResumeLayout(false);


        }


        #endregion
        
        public ScrenFrm()
        {
            InitializeComponent();
        }


        private Point downPiont = Point.Empty;//记录鼠标摁下的点
        private bool catchFinished = false;//用来表示截图是否完成
        private bool catchStart = false;    //截取开始
        private Bitmap originBitmap;       //用来保存原始图像
        private Rectangle catchRect;       //用来保存存取的矩形


        private void 截图_Load(object sender, EventArgs e)
        {
          originBitmap= new Bitmap(this.BackgroundImage);//BackgroundImage为全屏图片,我们另用变量来保存全屏图片
        }


        private void 截图_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                this.DialogResult = DialogResult.OK;
                this.Close();
            }
        }


        private void 截图_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (!catchStart)
                { catchStart = true;
                downPiont = new Point(e.X, e.Y);
                }
            }
        }


        private void 截图_MouseMove(object sender, MouseEventArgs e)
        {
            if (catchStart)
            {
                Bitmap destBitmap =(Bitmap)originBitmap.Clone();
                Point newPoint = new Point(e.X,e.Y);
                Graphics g = Graphics.FromImage(destBitmap);//在刚才新建的图片上新建一个画板
                Pen p = new Pen(Color.Blue, 1);
                int width = Math.Abs(e.X - downPiont.X), height = Math.Abs(e.Y - downPiont.Y);//获取矩形的长和宽              
                catchRect = new Rectangle(newPoint.X < downPiont.X ? newPoint.X : downPiont.X, newPoint.Y < downPiont.Y ? newPoint.Y : downPiont.Y, width, height);//保存矩形
                g.DrawRectangle(p, catchRect);//将矩形画在这个画板上
                g.Dispose();//释放目前的这个画板
                p.Dispose();
                Graphics g1 = this.CreateGraphics();//重新新建一个Graphics类
                //如果之前那个画板不释放,而直接g=this.CreateGraphics()这样的话无法释放掉第一次创建的g,因为只是把地址转到新的g了.如同string一样
                g1 = this.CreateGraphics();//在整个全屏窗体上新建画板
                g1.DrawImage(destBitmap, new Point(0, 0));//将刚才所画的图片画到这个窗体上
                //这个也可以属于二次缓冲技术,如果直接将矩形画在窗体上,会造成图片抖动并且会有无数个矩形.
                g1.Dispose();
                destBitmap.Dispose();//要及时释放,不然内存将会被大量消耗
            }
        }


        private void 截图_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (catchStart)
                {
                    catchStart = false;
                    catchFinished = true;
                }
            }
        }


        private void 截图_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && catchFinished)
            {
                if (catchRect.Contains(new Point(e.X, e.Y)))
                {
                    Bitmap CatchedBmp = new Bitmap(catchRect.Width, catchRect.Height);//新建一个于矩形等大的空白图片
                    Graphics g = Graphics.FromImage(CatchedBmp);
                    g.DrawImage(originBitmap, new Rectangle(0, 0, catchRect.Width, catchRect.Height), catchRect, GraphicsUnit.Pixel);
                    //把orginBmp中的指定部分按照指定大小画在画板上
                    Clipboard.SetImage(CatchedBmp);//将图片保存到剪贴板
                    g.Dispose();
                    catchFinished = false;
                    CatchedBmp.Dispose();
                    this.DialogResult = DialogResult.OK;
                    this.Close();
                }
            }
        } 
    } 

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注