在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#图形和图像处理 → C#类似QQ截图

C#类似QQ截图

C#图形和图像处理

下载此实例
  • 开发语言:C#
  • 实例大小:0.28M
  • 下载次数:126
  • 浏览次数:798
  • 发布时间:2015-11-05
  • 实例类别:C#图形和图像处理
  • 发 布 人:chaphy
  • 文件格式:.rar
  • 所需积分:2
 相关标签: QQ 截图 C#

实例介绍

【实例简介】
【实例截图】


【核心代码】



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


标签: QQ 截图 C#

实例下载地址

C#类似QQ截图

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 阳光在风雨后 发表于: 2017-11-23 17:07 24
你的截图框下边的按钮可以放大吗

支持(0) 盖楼(回复)

第 2 楼 小龙仔 发表于: 2020-11-20 14:04 00
可不可以加入自动框选的功能啊

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有2条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警