Exemplo n.º 1
0
        /// <summary>
        /// 按下左键后移动鼠标,标记截图区域
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Cutter_MouseMove(object sender, MouseEventArgs e)
        {
            // 确保截图开始
            if (Is_CatchStart)
            {
                // 新建一个图片对象,让它与屏幕图片相同
                Bitmap copyBmp = (Bitmap)WinBmp.Clone();

                // 获取鼠标按下的坐标
                Point newPoint = new Point(DownPonint.X, DownPonint.Y);

                // 新建画板和画笔
                Graphics g = Graphics.FromImage(copyBmp);
                Pen      p = new Pen(Color.Red, 1);

                // 获取矩形的长宽
                int width  = Math.Abs(e.X - DownPonint.X);
                int height = Math.Abs(e.Y - DownPonint.Y);
                if (e.X < DownPonint.X)
                {
                    newPoint.X = e.X;
                }
                if (e.Y < DownPonint.Y)
                {
                    newPoint.Y = e.Y;
                }

                CatchRectangle = new Rectangle(newPoint, new Size(width, height));

                // 将矩形画在画板上
                g.DrawRectangle(p, CatchRectangle);

                // 释放目前的画板
                g.Dispose();
                p.Dispose();
                // 从当前窗体创建新的画板
                Graphics g1 = this.CreateGraphics();

                // 将刚才所画的图片画到截图窗体上
                // 为什么不直接在当前窗体画图呢?
                // 如果自己解决将矩形画在窗体上,会造成图片抖动并且有无数个矩形
                // 这样实现也属于二次缓冲技术
                g1.DrawImage(copyBmp, new Point(0, 0));
                g1.Dispose();

                // 释放拷贝图片,防止内存被大量消耗
                copyBmp.Dispose();
            }
        }