C#中仿QQ截图

欢迎大家提出意见,一起讨论!

转载请标明是引用于 http://blog.csdn.net/chenyujing1234

代码(VS2008):

http://www.rayfile.com/zh-cn/files/bad4b357-978a-11e1-8b2d-0015c55db73d/ 

在工作中需要抓取图片,那么就花一会儿时间用C#自己写一个吧

关键技术:

用到了Graphics类的DrawRectangle方法;

双击鼠标选择的区域保存在系统剪贴板中,这一功能通过Clipboard类的SetImage方法实现的。

(1)Graphics类的DrawRectangle方法

它用来绘制由坐标对、宽度和高度指定的矩形

//     绘制由坐标对、宽度和高度指定的矩形。

        public void DrawRectangle(Pen pen, float x, float y, float width, float height);

        (2) Glipboard类的SetImage方法

它将Bitmap数据存储在剪贴上

// 将 System.Windows.Forms.DataFormats.Bitmap 格式的 System.Drawing.Image 添加到剪贴板中。

public static void SetImage(Image image);

设计过程:

Form1窗体的后台代码中,首先获取整个屏幕的抓图,然后传递给第二个窗体

 private void button1_Click(object sender, EventArgs e)
        {
            // 创建Image对象,用于存储整个屏幕的抓图
            Image img = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
            // 创建graphics对象
            Graphics g = Graphics.FromImage(img);
            // CopyFromScreen方法捕获整个屏幕图像
            g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size);
            // 获取句柄
            IntPtr dc = g.GetHdc();
            // 释放
            g.ReleaseHdc(dc);
            // 创建Frm_Browser对象
            Frm_Browser frm2 = new Frm_Browser(); 
            // 将img传递给ig
            frm2.ig = img;
            // 打开Frm_Browser窗体
            frm2.Show();
        }


Frm_Browser窗体的后台代码中,窗体的Load事件首先将Form1传递过来的屏幕图设定为窗体背景,

然后最大化。这样就可以在Frm_Browser窗体上使用鼠标选择截图的区域,以便保存

private void Frm_Browser_Load(object sender, EventArgs e)
        {
            // 将Form1传递过来的屏幕图设定为窗体背景
            this.BackgroundImage = ig;
            // 最大化窗体
            this.WindowState = FormWindowState.Maximized;
            // 创建Graphics对象
            MainPainter = this.CreateGraphics();
            pen = new Pen(Brushes.Tomato);
            // 判断鼠标是否按下
            isDowned = false;
            // 获取捕获的屏幕图像
            baseImage = this.BackgroundImage;
            // 创建Rectangle图像
            Rect = new Rectangle();
            // 是否出现边框
            RectReady = false;
            change = false;
            Rectpoints = new Rectangle[8];
            for (int i = 0; i < Rectpoints.Length; i ++ )
            {
                Rectpoints[i].Size = new Size(4, 4);
            }
        }


当鼠标移动时,会触发MouseMove事件,在此事件中,判断鼠标左键是否按下,如果按下,则开始获取鼠标拖动后的选区

private void Frm_Browser_MouseMove(object sender, MouseEventArgs e)
        {
            if (RectReady == true)
            {
                if (Rect.Contains(e.X, e.Y))
                {
                    if (isDowned == true && change == false)
                    {
                        // 和上一次的位置比较获取偏移量
                        Rect.X = Rect.X + e.X - tmpx;
                        Rect.Y = Rect.Y + e.Y - tmpy;
                        // 记录现在的位置
                        tmpx = e.X;
                        tmpy = e.Y;
                        MoveRect((Image)baseImage.Clone(), Rect);
                    }
                }
               
            } 
            else
            {
                if (isDowned == true)
                {
                    Image New = DrawScreen((Image)baseImage.Clone(), e.X, e.Y);
                    MainPainter.DrawImage(New, 0, 0);
                    New.Dispose();
                } 
                
            }
        }


 

 private void Frm_Browser_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (((MouseEventArgs)e).Button == MouseButtons.Left && Rect.Contains(((MouseEventArgs)e).X, ((MouseEventArgs)e).Y))
            {
                Image memory = new Bitmap(Rect.Width - 1, Rect.Height - 1);
                Graphics g = Graphics.FromImage(memory);
                g.CopyFromScreen(Rect.X + 1, Rect.Y + 1, 0, 0, Rect.Size);
                Clipboard.SetImage(memory);
                this.Close();
            }
        }


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值