基本信息
源码名称:C#类似QQ截图
源码大小:0.28M
文件格式:.rar
开发语言:C#
更新时间:2015-11-05
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍





private Main main;  //直接对Main窗体进行控制
        private APIMethod api = new APIMethod();  //调用API的完成类(将API的调用封装起来,是可以直接调用产生效果的类)
        private Rectangle area = Rectangle.Empty;  //截图矩形
        private Point op;  //area起点位置
        private Button b = new Button();  //CancelButton
        private int index = -1;
        private bool draw = false;
        private bool inited = false;  //确定是否已经完成area的绘制,以确定是否要显示矩形大小
        private bool drawing = false;  //确定是否进入画图状态,用来清除多余的GDI 图形
        private int type = -1;  //确定GDI 的类型
        private Graphics graphics;  //进行GDI 绘图
        private Point sl;  //初始位置
        private bool md = false;  //判断是否截图,如果发生MouseDown事件则开始截图,值为true
        private bool isdrew = false;  //是否使用过GDI ,如果使用过则不能拖动area
        private Pen pen;  //GDI 使用的画笔
        GraphicsPath points;  //画笔工具
        private Image img;  //GDI 绘图用的背景
        private Image origin; //原始桌面
        private bool fd = false;  //确定是否进行文字绘制
        private bool drew = false; //控制是否在重绘事件中绘制area
        public Snipping()
        {
            InitializeComponent();
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Snipping));
            ·imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11015")));
            imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11014")));
            imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11016")));
            imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11017")));
            imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11018")));
            imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11024")));
            imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11025")));
            imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("comres_1_2857")));
            pictureBox1.Image = imageList1.Images[0];
            pictureBox2.Image = imageList1.Images[1];
            pictureBox3.Image = imageList1.Images[2];
            pictureBox4.Image = imageList1.Images[3];
            pictureBox5.Image = imageList1.Images[4];
            pictureBox6.Image = imageList1.Images[5];
            pictureBox7.Image = imageList1.Images[6];
            pictureBox8.Image = imageList1.Images[7];
            b.Click = new EventHandler(b_Click);
            this.CancelButton = b;
        }
        private void Snipping_Load(object sender, EventArgs e)
        {
            main = (Main)this.Owner;
            this.Bounds = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
            this.BackgroundImage = origin = api.GetScreenSnapShot();
            graphics = this.CreateGraphics();
            pen = new Pen(label9.BackColor);
            points = new GraphicsPath();
            comboBox1.SelectedIndex = 0;
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
            this.UpdateStyles();
        }
        private void b_Click(object sender, EventArgs e)
        {
            api.ReleaseCursor();
            this.Dispose();
        }
        #endregion
        #region DrawLine
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            if (this.area == Rectangle.Empty && e.Button == MouseButtons.Left)
            {
                this.area.Location = new Point(e.X, e.Y);
            }
            this.op = new Point(e.X, e.Y);
            this.index = this.GetSelectedHandle(new Point(e.X, e.Y));
            this.SetCursor();
            draw = true;
            if (this.area.Contains(e.Location) && drawing)
            {
                sl = e.Location;
                md = true;
                RECT rect = new RECT();
                rect.left = this.area.Left;
                rect.right = this.area.Right;
                rect.top = this.area.Top;
                rect.bottom = this.area.Bottom;
                WindowsAPI.ClipCursor(ref rect);
            }
            if (textBox1.Visible)
            {
                graphics = Graphics.FromImage(origin);
                graphics.DrawString(textBox1.Text, textBox1.Font, new SolidBrush(label9.BackColor), new RectangleF(new Point(textBox1.Location.X, textBox1.Location.Y 2), textBox1.Size));
                graphics = Graphics.FromImage(img);
                graphics.DrawString(textBox1.Text, textBox1.Font, new SolidBrush(label9.BackColor), new RectangleF(new Point(textBox1.Location.X, textBox1.Location.Y 2), textBox1.Size));
                graphics = this.CreateGraphics();
                graphics.DrawImage(img, new Point(0, 0));                
                textBox1.Text = "";
                textBox1.Visible = false;
                api.ReleaseCursor();
                fd = false;
            }
        }
        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
            if (drawing && md)
            {
                DrawGDI(type, e.Location);
                if (type == 2)
                    fd = true;
            }
            else
            {
                if (this.Capture)
                {
                    this.MoveHandleTo(new Point(e.X, e.Y));
                    this.Invalidate();
                }
                else
                {
                    this.index = this.GetSelectedHandle(new Point(e.X, e.Y));
                    this.SetCursor();
                }
            }
        }
        protected override void OnMouseUp(MouseEventArgs e)
        {
            if (!this.IsDisposed)
            {
                base.OnMouseUp(e);
                int left = area.Left;
                int top = area.Top;
                int right = area.Right;
                int bottom = area.Bottom;
                area.X = Math.Min(left, right);
                area.Y = Math.Min(top, bottom);
                area.Width = Math.Abs(left - right);
                area.Height = Math.Abs(top - bottom);
                if (e.Button == MouseButtons.Right)
                {
                    if (this.area == Rectangle.Empty)
                    {
                        this.DialogResult = DialogResult.Cancel;
                    }
                    else
                    {
                        this.area = Rectangle.Empty;
                        this.Invalidate();
                    }
                }
                this.index = this.GetSelectedHandle(new Point(e.X, e.Y));
                this.SetCursor();
                if (drawing && md)
                {
                    if (type == 2 && fd)
                    {
                        md = false;
                        textBox1.Visible = true;
                        textBox1.Focus();
                    }
                    else
                    {
                        DrawGDI(type, e.Location);
                        md = false;
                        DrawGDI(type, e.Location);
                        api.ReleaseCursor();
                        if (type == 4)
                            points.Reset();
                    }
                }
                draw = false;
                if (!inited)
                    inited = true;
                this.Refresh();
            }
        }
        private void DrawGDI(int drawtype, Point p)
        {
            PointF rectStartPointF = sl;
            switch (drawtype)
            {
                case 0:
                    {
                        float width = Math.Abs(p.X - sl.X);
                        float heigth = Math.Abs(p.Y - sl.Y);
                        if (p.X < sl.X)
                        {
                            rectStartPointF.X = p.X;
                        }
                        if (p.Y < sl.Y)
                        {
                            rectStartPointF.Y = p.Y;
                        }
                        if (!md)
                        {
                            graphics = Graphics.FromImage(origin);
                            graphics.DrawRectangle(pen, rectStartPointF.X, rectStartPointF.Y, width, heigth);
                            graphics = Graphics.FromImage(img);
                            graphics.DrawRectangle(pen, rectStartPointF.X, rectStartPointF.Y, width, heigth);
                            graphics = this.CreateGraphics();
                            graphics.DrawImage(img, new Point(0, 0));
                        }
                        else
                        {
                            Image image = (Image)this.img.Clone();
                            graphics = Graphics.FromImage(image);
                            graphics.DrawRectangle(pen, rectStartPointF.X, rectStartPointF.Y, width, heigth);
                            graphics = this.CreateGraphics();
                            graphics.DrawImage(image, new Point(0, 0));
                        }
                        isdrew = true;
                        break;
                    }
                case 1:
                    {
                        float width = Math.Abs(p.X - sl.X);
                        float heigth = Math.Abs(p.Y - sl.Y);
                        if (p.X < sl.X)
                        {
                            rectStartPointF.X = p.X;
                        }
                        if (p.Y < sl.Y)
                        {
                            rectStartPointF.Y = p.Y;
                        }
                        if (!md)
                        {
                            graphics = Graphics.FromImage(origin);
                            graphics.DrawEllipse(pen, rectStartPointF.X, rectStartPointF.Y, width, heigth);
                            graphics = Graphics.FromImage(img);
                            graphics.DrawEllipse(pen, rectStartPointF.X, rectStartPointF.Y, width, heigth);
                            graphics = this.CreateGraphics();
                            graphics.DrawImage(img, new Point(0, 0));
                        }
                        else
                        {
                            Image image = (Image)this.img.Clone();
                            graphics = Graphics.FromImage(image);
                            graphics.DrawEllipse(pen, rectStartPointF.X, rectStartPointF.Y, width, heigth);
                            graphics = this.CreateGraphics();
                            graphics.DrawImage(image, new Point(0, 0));
                        }
                        isdrew = true;
                        break;
                    }
                case 2:
                    {
                        float width = Math.Abs(p.X - sl.X);
                        float heigth = Math.Abs(p.Y - sl.Y);
                        if (p.X < sl.X)
                        {
                            rectStartPointF.X = p.X;
                        }
                        if (p.Y < sl.Y)
                        {
                            rectStartPointF.Y = p.Y;
                        }
                        Image image = (Image)this.img.Clone();
                        graphics = Graphics.FromImage(image);
                        graphics.DrawRectangle(Pens.Black, rectStartPointF.X, rectStartPointF.Y, width, heigth);
                        textBox1.Size = new Size((int)width, (int)heigth);
                        textBox1.Location = sl;
                        graphics = this.CreateGraphics();
                        graphics.DrawImage(image, new Point(0, 0));
                        isdrew = true;
                        break;
                    }
                case 3:
                    {     
                        if (!md)
                        {
                            graphics = Graphics.FromImage(origin);
                            pen.EndCap = LineCap.ArrowAnchor;
                            pen.Width = 4;
                            graphics.DrawLine(pen, sl, p);
                            graphics = Graphics.FromImage(img);
                            graphics.DrawLine(pen, sl, p);
                            pen.Width = 1;
                            pen.EndCap = LineCap.NoAnchor;
                            graphics = this.CreateGraphics();
                            graphics.DrawImage(img, new Point(0, 0));
                        }
                        else
                        {
                            Image image = (Image)this.img.Clone();
                            graphics = Graphics.FromImage(image);
                            pen.EndCap = LineCap.ArrowAnchor;
                            pen.Width = 4;
                            graphics.DrawLine(pen, sl, p);
                            pen.Width = 1;
                            pen.EndCap = LineCap.NoAnchor;
                            graphics = this.CreateGraphics();
                            graphics.DrawImage(image, new Point(0, 0));
                        }
                        isdrew = true;
                        break;
                    }
                case 4:
                    {
                        if (!md)
                        {
                            points.AddLine(p, p);
                            graphics = Graphics.FromImage(origin);
                            graphics.DrawPath(pen, points);
                            graphics = Graphics.FromImage(img);
                            graphics.DrawPath(pen, points);
                            graphics = this.CreateGraphics();
                            graphics.DrawImage(img, new Point(0, 0));
                        }
                        else
                        {
                            graphics = this.CreateGraphics();
                            points.AddLine(p, p);
                            graphics.DrawPath(pen, points);
                        }
                        isdrew = true;
                        break;
                    }
            }
            drew = true;
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            if (drawing)
                return;
            if (!drew)
            {
                e.Graphics.DrawRectangle(new Pen(this.ForeColor), this.area);
                for (int i = 1; i < 9; i )
                {
                    e.Graphics.FillRectangle(new SolidBrush(Color.Blue), this.GetHandleRect(i));
                }
            }
            if (draw && !inited)
            {
                Point p = new Point(area.Right, area.Bottom);
                string str = Math.Abs(area.Width).ToString() " × " Math.Abs(area.Height).ToString();
                e.Graphics.DrawString(str, new Font("宋体", 12, FontStyle.Bold), Brushes.White, new Point(p.X, p.Y - 30));
                e.Graphics.FillRectangle(Brushes.Black, new Rectangle(new Point(p.X, p.Y - 30), new Size((int)e.Graphics.MeasureString(str, new Font("宋体", 12, FontStyle.Bold)).Width 4, 20)));
                e.Graphics.DrawString(str, new Font("宋体", 12, FontStyle.Bold), Brushes.White, new Point(p.X, p.Y - 30));
            }
            if (inited && !drawing)
            {
                pictureBox1.Visible = true;
                pictureBox1.Location = new Point(this.area.Left, this.area.Bottom 5);
                pictureBox2.Visible = true;
                pictureBox2.Location = new Point(this.area.Left 18, this.area.Bottom 5);
                pictureBox8.Visible = true;
                pictureBox8.Location = new Point(this.area.Left 36, this.area.Bottom 5);
                pictureBox3.Visible = true;
                pictureBox3.Location = new Point(this.area.Left 54, this.area.Bottom 5);
                pictureBox4.Visible = true;
                pictureBox4.Location = new Point(this.area.Left 72, this.area.Bottom 5);
                pictureBox5.Visible = true;
                pictureBox5.Location = new Point(this.area.Left 90, this.area.Bottom 5);
                pictureBox6.Visible = true;
                pictureBox6.Location = new Point(this.area.Left 108, this.area.Bottom 5);
                pictureBox7.Visible = true;
                pictureBox7.Location = new Point(this.area.Left 126, this.area.Bottom 5);
            }
        }
        #endregion
        #region DrawAREA
        private int GetSelectedHandle(Point p)
        {
            int index = -1;
            for (int i = 1; i < 9; i )
            {
                if (GetHandleRect(i).Contains(p))
                {
                    index = i;
                    break;
                }
            }
            if (this.area.Contains(p)) index = 0;
            System.Diagnostics.Trace.WriteLine(area.ToString());
            System.Diagnostics.Trace.WriteLine(p.ToString());
            System.Diagnostics.Trace.WriteLine(index.ToString());
            return index;
        }
        private void MoveHandleTo(Point point)
        {
            if (isdrew)
                return;
            int left = area.Left;
            int top = area.Top;
            int right = area.Right;
            int bottom = area.Bottom;
            switch (index)
            {
                case 0:
                    area.X = point.X - op.X;
                    area.Y = point.Y - op.Y;
                    this.op = point;
                    return;
                case 1:
                    left = point.X;
                    top = point.Y;
                    break;
                case 2:
                    top = point.Y;
                    break;
                case 3:
                    right = point.X;
                    top = point.Y;
                    break;
                case 4:
                    right = point.X;
                    break;
                case 5:
                    right = point.X;
                    bottom = point.Y;
                    break;
                case 6:
                    bottom = point.Y;
                    break;
                case 7:
                    left = point.X;
                    bottom = point.Y;
                    break;
                case 8:
                    left = point.X;
                    break;
            }
            this.op = point;
            area.X = left;
            area.Y = top;
            area.Width = right - left;
            area.Height = bottom - top;
        }
        private void SetCursor()
        {
            Cursor cr = Cursors.Default;
            if (index == 1 || index == 5)
            {
                cr = Cursors.SizeNWSE;
            }
            else if (index == 2 || index == 6)
            {
                cr = Cursors.SizeNS;
            }
            else if (index == 3 || index == 7)
            {
                cr = Cursors.SizeNESW;
            }
            else if (index == 4 || index == 8)
            {
                cr = Cursors.SizeWE;
            }
            else if (index == 0)
            {
                cr = Cursors.Default;
            }
            Cursor.Current = cr;
        }
        private Rectangle GetHandleRect(int index)
        {
            Point point = GetHandle(index);
            return new Rectangle(point.X - 3, point.Y - 3, 5, 5);
        }
        private Point GetHandle(int index)
        {
            int x, y, xCenter, yCenter;
            xCenter = area.X area.Width / 2;
            yCenter = area.Y area.Height / 2;
            x = area.X;
            y = area.Y;
            switch (index)
            {
                case 1:
                    x = area.X;
                    y = area.Y;
                    break;
                case 2:
                    x = xCenter;
                    y = area.Y;
                    break;
                case 3:
                    x = area.Right;
                    y = area.Y;
                    break;
                case 4:
                    x = area.Right;
                    y = yCenter;
                    break;
                case 5:
                    x = area.Right;
                    y = area.Bottom;
                    break;
                case 6:
                    x = xCenter;
                    y = area.Bottom;
                    break;
                case 7:
                    x = area.X;
                    y = area.Bottom;
                    break;
                case 8:
                    x = area.X;
                    y = yCenter;
                    break;
            }
            return new Point(x, y);
        }
        #endregion