在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#图形和图像处理 → C# 仿qq截图功能 例子完整源码下载

C# 仿qq截图功能 例子完整源码下载

C#图形和图像处理

下载此实例
  • 开发语言:C#
  • 实例大小:0.40M
  • 下载次数:178
  • 浏览次数:3178
  • 发布时间:2013-08-31
  • 实例类别:C#图形和图像处理
  • 发 布 人:crazycode
  • 文件格式:.rar
  • 所需积分:2
 相关标签: QQ 截图 C#

实例介绍

【实例简介】仿qq截图功能,如下图

【实例截图】

【核心代码】


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Threading;

namespace CSharpWin_JD.CaptureImage
{

    public partial class CaptureImageTool : Form
    {
        /// <summary>
        /// 遮罩层颜色
        /// </summary>
        private static SolidBrush mask = new SolidBrush(Color.FromArgb(100, 0, 0, 0));
        /// <summary>
        /// 原始屏幕图
        /// </summary>
        private Image ScreenImage;

        #region Fields

        private Image _image;
        private CaptureImageToolColorTable _colorTable;
        private Cursor _selectCursor = Cursors.Default;
        private Cursor _drawCursor = Cursors.Cross;

        private Point _mouseDownPoint;
        private Point _endPoint;
        private bool _mouseDown;
        private Rectangle _selectImageRect;
        private Rectangle _selectImageBounds;
        private bool _selectedImage;
        private SizeGrip _sizeGrip;
        private Dictionary<SizeGrip,Rectangle> _sizeGripRectList;
        private OperateManager _operateManager;
        private List<Point> _linePointList;

        private static readonly Font TextFont =
           new Font("Times New Roman", 12F, FontStyle.Bold, GraphicsUnit.Point, 0);
        private static readonly string ToolTipStartCapture = "按住左键不放选择截图区域";

        #endregion

        #region Constructors

        public CaptureImageTool()
        {
            InitializeComponent();
            Init();
        }

        #endregion

        #region Properties

        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public CaptureImageToolColorTable ColorTable
        {
            get
            {
                if (_colorTable == null)
                {
                    _colorTable = new CaptureImageToolColorTable();
                }
                return _colorTable;
            }
            set
            {
                _colorTable = value;
                base.Invalidate();
                SetControlColorTable();
            }
        }

        private void SetControlColorTable()
        {
            CaptureImageToolColorTable colorTable = ColorTable;
            ToolStripRendererEx renderer = new ToolStripRendererEx(colorTable);
            contextMenuStrip.Renderer = renderer;
            drawToolsControl.ColorTable = colorTable;
            colorSelector.ColorTable = colorTable;
        }

        public Image Image
        {
            get { return _image; }
        }

        public Cursor SelectCursor
        {
            get { return _selectCursor; }
            set { _selectCursor = value; }
        }

        public Cursor DrawCursor
        {
            get { return _drawCursor; }
            set { _drawCursor = value; }
        }

        internal bool SelectedImage
        {
            get { return _selectedImage; }
            set { _selectedImage = value; }
        }

        internal Rectangle SelectImageRect
        {
            get { return _selectImageRect; }
            set
            {
                _selectImageRect = value;
                if (!_selectImageRect.IsEmpty)
                {
                    CalCulateSizeGripRect();
                    base.Invalidate();
                }
            }
        }

        internal SizeGrip SizeGrip
        {
            get { return _sizeGrip; }
            set { _sizeGrip = value; }
        }

        internal Dictionary<SizeGrip, Rectangle> SizeGripRectList
        {
            get
            {
                if (_sizeGripRectList == null)
                {
                    _sizeGripRectList = new Dictionary<SizeGrip,Rectangle>();
                }
                return _sizeGripRectList;
            }
        }

        internal OperateManager OperateManager
        {
            get
            {
                if (_operateManager == null)
                {
                    _operateManager = new OperateManager();
                }
                return _operateManager;
            }
        }

        private DrawStyle DrawStyle
        {
            get { return drawToolsControl.DrawStyle; }
        }

        private Color SelectedColor
        {
            get { return colorSelector.SelectedColor; }
        }

        private int FontSize
        {
            get { return colorSelector.FontSize; }
        }

        private List<Point> LinePointList
        {
            get
            {
                if (_linePointList == null)
                {
                    _linePointList = new List<Point>(100);
                }
                return _linePointList;
            }
        }

        #endregion

        #region Override Methods

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            toolTip.SetToolTip(this, ToolTipStartCapture);
        }

        protected override void OnMouseEnter(EventArgs e)
        {
            base.OnMouseEnter(e);
            Cursor = SelectCursor;
            if (!SelectedImage)
            {
                this.Invalidate(true);
                this.Update();
            }
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);

            if (textBox.Visible)
            {
                if (SelectImageRect.Contains(e.Location) ||
                    e.Button == MouseButtons.Left)
                {
                    string text = textBox.Text;
                    Font font = textBox.Font;
                    Color color = textBox.ForeColor;

                    HideTextBox();
                    if (OperateManager.OperateCount > 0)
                    {
                        OperateObject obj =
                            OperateManager.OperateList[OperateManager.OperateCount - 1];
                        if (obj.OperateType == OperateType.DrawText)
                        {
                            DrawTextData textData = obj.Data as DrawTextData;
                            if (!textData.Completed)
                            {
                                if (string.IsNullOrEmpty(text))
                                {
                                    OperateManager.RedoOperate();
                                }
                                else
                                {
                                    obj.Color = color;
                                    textData.Font = font;
                                    textData.Text = text;
                                    textData.Completed = true;
                                }
                            }
                        }
                    }
                }
                base.Invalidate();
                return;
            }

            if (e.Button == MouseButtons.Left)
            {
                if (SelectedImage)
                {
                    if (SizeGrip != SizeGrip.None)
                    {
                        _mouseDown = true;
                        _mouseDownPoint = e.Location;
                        HideDrawToolsControl();
                        base.Invalidate();
                    }

                    if (DrawStyle != DrawStyle.None)
                    {
                        if (SelectImageRect.Contains(e.Location))
                        {
                            _mouseDown = true;
                            _mouseDownPoint = e.Location;

                            if (DrawStyle == DrawStyle.Line)
                            {
                                LinePointList.Add(_mouseDownPoint);
                            }
                            ClipCursor(false);
                        }
                    }
                }
                else
                {
                    _mouseDown = true;
                    _mouseDownPoint = e.Location;
                }
            }
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
            if (_mouseDown)
            {
                if (!SelectedImage)
                {
                    SelectImageRect = GetSelectImageRect(e.Location);
                }
                else
                {
                    if (DrawStyle != DrawStyle.None)
                    {
                        _endPoint = e.Location;
                        if (DrawStyle == DrawStyle.Line)
                        {
                            LinePointList.Add(_endPoint);
                        }
                        base.Invalidate();
                    }
                    else if (SizeGrip != SizeGrip.None)
                    {
                        ChangeSelctImageRect(e.Location);
                    }
                }
            }
            else
            {
                if (!SelectedImage)
                {
                    toolTip.SetToolTip(this, ToolTipStartCapture);
                }
                else
                {
                    if (DrawStyle == DrawStyle.None)
                    {
                        if (OperateManager.OperateCount == 0)
                        {
                            SetSizeGrip(e.Location);
                        }
                    }
                    else
                    {
                        if(SelectImageRect.Contains(e.Location))
                        {
                            Cursor = DrawCursor;
                        }
                        else
                        {
                            Cursor = SelectCursor;
                        }
                    }
                }
            }
        }

        protected override void OnMouseUp(MouseEventArgs e)
        {
            base.OnMouseUp(e);

            if (e.Button == MouseButtons.Left)
            {
                if (!SelectedImage)
                {
                    SelectImageRect = GetSelectImageRect(e.Location);
                    if (!SelectImageRect.IsEmpty)
                    {
                        SelectedImage = true;
                        ShowDrawToolsControl();
                    }
                }
                else
                {
                    _endPoint = e.Location;
                    base.Invalidate();
                    if (DrawStyle != DrawStyle.None)
                    {
                        ClipCursor(true);
                        AddOperate(e.Location);
                    }
                    else if (SizeGrip != SizeGrip.None)
                    {
                        _selectImageBounds = SelectImageRect;
                        ShowDrawToolsControl();
                        SizeGrip = SizeGrip.None;
                    }
                }

                _mouseDown = false;
                _mouseDownPoint = Point.Empty;
            }
            else if (e.Button == MouseButtons.Right)
            {
                if (SelectedImage)
                {
                    if (SelectImageRect.Contains(e.Location))
                    {
                        contextMenuStrip.Show(this, e.Location);
                        contextMenuStripVisible = true;
                    }
                    else
                    {
                        ResetSelectImage();
                    }
                }
                else
                {
                    DialogResult = DialogResult.Cancel;
                }
            }
        }

        protected override void OnMouseDoubleClick(MouseEventArgs e)
        {
            base.OnMouseDoubleClick(e);

            bool contains = SelectImageRect.Contains(e.Location);
            if (e.Button == MouseButtons.Left)
            {
                if (contains)
                {
                    DrawLastImage();
                    DialogResult = DialogResult.OK;
                }
            }
            else if (e.Button == MouseButtons.Right)
            {
                if (!contains)
                {
                    DialogResult = DialogResult.Cancel;
                }
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            //if (SelectImageRect.IsEmpty)
            //{
            //    base.OnPaint(e);
            //    return;
            //}
            base.OnPaint(e);

            //将所选择区域原色显示
            //画突出显示的部分
            Graphics oldg = e.Graphics;
            oldg.DrawImage(this.ScreenImage, SelectImageRect, SelectImageRect, GraphicsUnit.Pixel);

            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.AntiAlias;

            if (SelectImageRect.Width != 0 && SelectImageRect.Height != 0 )
            {
                Rectangle rect = SelectImageRect;
                CaptureImageToolColorTable colorTable = ColorTable;
                if (_mouseDown)
                {
                    if (!SelectedImage || SizeGrip != SizeGrip.None)
                    {
                        using (SolidBrush brush = new SolidBrush(
                            Color.FromArgb(0, colorTable.BackColorNormal)))
                        {
                            g.FillRectangle(brush, rect);
                        }

                        DrawImageSizeInfo(g, rect);
                    }
                }

                using (Pen pen = new Pen(colorTable.BorderColor))
                {
                    g.DrawRectangle(pen, rect);

                    using (SolidBrush brush = new SolidBrush(colorTable.BackColorPressed))
                    {
                        foreach (Rectangle sizeGripRect in SizeGripRectList.Values)
                        {
                            g.FillRectangle(
                                brush,
                                sizeGripRect);
                        }
                    }
                }

                DrawOperate(g);

                if (DrawStyle != DrawStyle.None)
                {
                    DrawTools(g, _endPoint);
                }
            }

            
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);
            if (_sizeGripRectList != null)
            {
                _sizeGripRectList.Clear();
                _sizeGripRectList = null;
            }
            if (_operateManager != null)
            {
                _operateManager.Dispose();
                _operateManager = null;
            }
            if (_linePointList != null)
            {
                _linePointList.Clear();
                _linePointList = null;
            }

            _selectCursor = null;
            _drawCursor = null;
        }

        #endregion

        #region Draw Methods

        private void DrawImageSizeInfo(Graphics g, Rectangle rect)
        {
            string text = string.Format(
                            "{0}x{1}",
                            rect.Width,
                            rect.Height);
            Size textSize = TextRenderer.MeasureText(text, TextFont);
            Rectangle screenBounds = Screen.GetBounds(this);
            int x = 0;
            int y = 0;
            if (rect.X   textSize.Width > screenBounds.Right - 3)
            {
                x = screenBounds.Right - textSize.Width - 3;
            }
            else
            {
                x = rect.X   2;
            }

            if (rect.Y - textSize.Width < screenBounds.Y   3)
            {
                y = rect.Y   2;
            }
            else
            {
                y = rect.Y - textSize.Height - 2;
            }

            Rectangle textRect = new Rectangle(
                x, y, textSize.Width, textSize.Height);
            g.FillRectangle(Brushes.Black, textRect);
            TextRenderer.DrawText(
                g,
                text,
                TextFont,
                textRect,
                Color.White);
        }

        private void DrawTools(Graphics g, Point point)
        {
            if (!SelectImageRect.Contains(_mouseDownPoint))
            {
                return;
            }

            Color color = SelectedColor;

            switch (DrawStyle)
            {
                case DrawStyle.Rectangle:
                    using (Pen pen = new Pen(color))
                    {
                        g.DrawRectangle(
                            pen,
                            ImageBoundsToRect(Rectangle.FromLTRB(
                            _mouseDownPoint.X,
                            _mouseDownPoint.Y,
                            point.X,
                            point.Y)));
                    }
                    break;
                case DrawStyle.Ellipse:
                    using (Pen pen = new Pen(color))
                    {
                        g.DrawEllipse(
                            pen,
                            ImageBoundsToRect(Rectangle.FromLTRB(
                            _mouseDownPoint.X,
                            _mouseDownPoint.Y,
                            point.X,
                            point.Y)));
                    }
                    break;
                case DrawStyle.Arrow:
                    using (Pen pen = new Pen(color))
                    {
                        pen.EndCap = LineCap.ArrowAnchor;
                        pen.EndCap = LineCap.Custom;
                        pen.CustomEndCap = new AdjustableArrowCap(4, 4, true);
                        g.DrawLine(pen, _mouseDownPoint, point);
                    }
                    break;
                case DrawStyle.Text:
                    using (Pen pen = new Pen(color))
                    {
                        pen.DashStyle = DashStyle.DashDot;
                        pen.DashCap = DashCap.Round;
                        pen.DashPattern = new float[] { 9f, 3f, 3f, 3f };

                        g.DrawRectangle(
                            pen,
                            ImageBoundsToRect(Rectangle.FromLTRB(
                            _mouseDownPoint.X,
                            _mouseDownPoint.Y,
                            point.X,
                            point.Y)));
                    }
                    break;
                case DrawStyle.Line:
                    if (LinePointList.Count < 2)
                    {
                        return;
                    }

                    Point[] points = LinePointList.ToArray();

                    using (Pen pen = new Pen(color))
                    {
                        g.DrawLines(
                           pen,
                           points);
                    }
                    break;
            }
        }

        private void DrawOperate(Graphics g)
        {
            foreach (OperateObject obj in OperateManager.OperateList)
            {
                switch (obj.OperateType)
                {
                    case OperateType.DrawRectangle:
                        using (Pen pen = new Pen(obj.Color))
                        {
                            g.DrawRectangle(
                                pen,
                                (Rectangle)obj.Data);
                        }
                        break;
                    case OperateType.DrawEllipse:
                        using (Pen pen = new Pen(obj.Color))
                        {
                            g.DrawEllipse(
                                pen,
                                (Rectangle)obj.Data);
                        }
                        break;
                    case OperateType.DrawArrow:
                        Point[] points = obj.Data as Point[];
                        using (Pen pen = new Pen(obj.Color))
                        {
                            pen.EndCap = LineCap.Custom;
                            pen.CustomEndCap = new AdjustableArrowCap(4, 4, true);
                            g.DrawLine(pen, points[0], points[1]);
                        }
                        break;
                    case OperateType.DrawText:
                        DrawTextData textdata = obj.Data as DrawTextData;

                        if (string.IsNullOrEmpty(textdata.Text))
                        {
                            using (Pen pen = new Pen(obj.Color))
                            {
                                pen.DashStyle = DashStyle.DashDot;
                                pen.DashCap = DashCap.Round;
                                pen.DashPattern = new float[] { 9f, 3f, 3f, 3f };
                                g.DrawRectangle(
                                    pen,
                                    textdata.TextRect);
                            }
                        }
                        else
                        {
                            using (SolidBrush brush = new SolidBrush(obj.Color))
                            {
                                g.DrawString(
                                    textdata.Text,
                                    textdata.Font,
                                    brush,
                                    textdata.TextRect);
                            }
                        }
                        break;
                    case OperateType.DrawLine:
                        using (Pen pen = new Pen(obj.Color))
                        {
                            g.DrawLines(pen, obj.Data as Point[]);
                        }
                        break;
                }
            }
        }

        private void DrawLastImage()
        {
            using (Bitmap allBmp = new Bitmap(
                Width, Height, PixelFormat.Format32bppArgb))
            {
                using (Graphics allGraphics = Graphics.FromImage(allBmp))
                {
                    allGraphics.InterpolationMode =
                        InterpolationMode.HighQualityBicubic;
                    allGraphics.SmoothingMode = SmoothingMode.AntiAlias;

                    //使用原始图片获取截图(涂剑凯修改)
                    allGraphics.DrawImage(ScreenImage, Point.Empty);
                    //使用窗体背景图片截图(原版)
                    //allGraphics.DrawImage(BackgroundImage,Point.Empty);

                    DrawOperate(allGraphics);
                    allGraphics.Flush();

                    Bitmap bmp = new Bitmap(
                       SelectImageRect.Width,
                       SelectImageRect.Height,
                       PixelFormat.Format32bppArgb);
                    Graphics g = Graphics.FromImage(bmp);
                    g.DrawImage(
                        allBmp,
                        0,
                        0,
                        SelectImageRect,
                        GraphicsUnit.Pixel);

                    g.Flush();
                    g.Dispose();
                    _image = bmp;
                }
            }
            //将图片放到剪贴板(涂剑凯添加)
            Clipboard.SetDataObject(this.Image,true);
        }

        #endregion

        #region Events Methods

        private void ColorSelectorColorChanged(object sender, EventArgs e)
        {
            if (DrawStyle == DrawStyle.Text && textBox.Visible)
            {
                textBox.ForeColor = SelectedColor;
            }
        }

        private void DrawToolsControlButtonDrawStyleClick(object sender, EventArgs e)
        {
            switch (DrawStyle)
            {
                case DrawStyle.Rectangle:
                case DrawStyle.Ellipse:
                case DrawStyle.Arrow:
                case DrawStyle.Line:
                    colorSelector.Reset();
                    ShowColorSelector();
                    if (SizeGrip != SizeGrip.None)
                    {
                        SizeGrip = SizeGrip.None;
                    }
                    break;
                case DrawStyle.Text:
                    colorSelector.ChangeToFontStyle();
                    ShowColorSelector();
                    if (SizeGrip != SizeGrip.None)
                    {
                        SizeGrip = SizeGrip.None;
                    }
                    break;
                case DrawStyle.None:
                    HideColorSelector();
                    break;
            }
        }

        private void DrawToolsControlButtonRedoClick(object sender, EventArgs e)
        {
            if (OperateManager.OperateCount > 0)
            {
                OperateManager.RedoOperate();
                base.Invalidate();
            }
            else
            {
                if (SelectedImage)
                {
                    ResetSelectImage();
                    base.Invalidate();
                }
            }
        }

        private void DrawToolsControlButtonSaveClick(object sender, EventArgs e)
        {
            if (SelectedImage)
            {
                //默认文件名
                //saveFileDialog.FileName = "JD"  DateTime.Now.ToString("yyyyMMddHHmmss") "_"  new Random().Next(1000000, 9999999)   "."   saveFileDialog.DefaultExt;
                saveFileDialog.FileName = "JD"   DateTime.Now.ToString("yyyyMMddHHmmss")   "."   saveFileDialog.DefaultExt;

                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    DrawLastImage();
                    string fileName = saveFileDialog.FileName;
                    int index = fileName.LastIndexOf('.');
                    string extion = fileName.Substring(
                        index   1, fileName.Length - index - 1);
                    extion = extion.ToLower();

                    ImageFormat imageFormat = ImageFormat.Bmp;

                    switch (extion)
                    {
                        case "jpg":
                        case "jpeg":
                            imageFormat = ImageFormat.Jpeg;
                            break;
                        case "png":
                            imageFormat = ImageFormat.Png;
                            break;
                        case "gif":
                            imageFormat = ImageFormat.Gif;
                            break;
                    }
                    Image.Save(saveFileDialog.FileName, imageFormat);
                    DialogResult = DialogResult.Cancel;
                    this.Close();
                }
            }
            else
            {
                MessageBox.Show("请先选择图像。", "截图", MessageBoxButtons.OK);
            }
        }

        private void DrawToolsControlButtonAcceptClick(object sender, EventArgs e)
        {
            if (SelectedImage)
            {
                DrawLastImage();
                DialogResult = DialogResult.OK;
            }
            else
            {
                DialogResult = DialogResult.Cancel;
            }
        }

        private void DrawToolsControlButtonExitClick(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
        }

        private void MenuItemReselectClick(object sender, EventArgs e)
        {
            if (SelectedImage)
            {
                ResetSelectImage();
            }
        }

        private void TextBoxExLostFocus(object sender, EventArgs e)
        {
            if (textBox.Visible)
            {
                string text = textBox.Text;
                Font font = textBox.Font;
                Color color = textBox.ForeColor;

                HideTextBox();
                if (OperateManager.OperateCount > 0)
                {
                    OperateObject obj =
                        OperateManager.OperateList[OperateManager.OperateCount - 1];
                    if (obj.OperateType == OperateType.DrawText)
                    {
                        DrawTextData textData = obj.Data as DrawTextData;
                        if (!textData.Completed)
                        {
                            if (string.IsNullOrEmpty(text))
                            {
                                OperateManager.RedoOperate();
                            }
                            else
                            {
                                obj.Color = color;
                                textData.Font = font;
                                textData.Text = text;
                                textData.Completed = true;
                            }
                        }
                    }
                }
                base.Invalidate();
            }
        }

        #endregion

        #region Private Methods

        private void Init()
        {
            SetStyle( ControlStyles.UserPaint |  ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
            //双缓冲绘制,避免闪烁
            //this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);

            drawToolsControl.Visible = false;
            colorSelector.Visible = false;
            textBox.Visible = false;

            this.TopMost = true;
            this.ShowInTaskbar = false;
            this.FormBorderStyle = FormBorderStyle.None;
            //Bounds = Screen.GetBounds(this);
            this.Bounds = System.Windows.Forms.Screen.PrimaryScreen.Bounds;            

            //保留当前屏
            ScreenImage = GetDestopImage();
            //复制当前屏
            Image BackScreen = new Bitmap(ScreenImage);
            Graphics g = Graphics.FromImage(BackScreen);
            //画遮罩
            g.FillRectangle(mask, 0, 0, BackScreen.Width, BackScreen.Height);
            g.Dispose();
            //将有遮罩的图像作为背景
            this.BackgroundImage = BackScreen;

            //BackgroundImage = GetDestopImage();

            try
            {
                _selectCursor = new Cursor(Properties.Resources.Arrow_M.Handle);
            }
            catch{}
            Cursor = SelectCursor;
            contextMenuStrip.Renderer = new ToolStripRendererEx();

            textBox.LostFocus  = new EventHandler(TextBoxExLostFocus);

            colorSelector.ColorChanged  = new EventHandler(
                ColorSelectorColorChanged);

            drawToolsControl.ButtonExitClick  = new EventHandler(
                DrawToolsControlButtonExitClick);
            drawToolsControl.ButtonAcceptClick  = new EventHandler(
                DrawToolsControlButtonAcceptClick);
            drawToolsControl.ButtonSaveClick  = new EventHandler(
                DrawToolsControlButtonSaveClick);
            drawToolsControl.ButtonRedoClick  = new EventHandler(
                DrawToolsControlButtonRedoClick);
            drawToolsControl.ButtonDrawStyleClick  = new EventHandler(
                DrawToolsControlButtonDrawStyleClick);

            menuItemExit.Click  = new EventHandler(
                DrawToolsControlButtonExitClick);
            menuItemAccept.Click  = new EventHandler(
                DrawToolsControlButtonAcceptClick);
            menuItemSave.Click  = new EventHandler(
                DrawToolsControlButtonSaveClick);
            menuItemRedo.Click  = new EventHandler(
                DrawToolsControlButtonRedoClick);
            menuItemReselect.Click  = new EventHandler(
                MenuItemReselectClick);
        }

        /// <summary>
        /// 截取完整屏幕图片
        /// </summary>
        /// <returns></returns>
        private Image GetDestopImage()
        {
            Rectangle rect = Screen.GetBounds(this);
            Bitmap bmp = new Bitmap(
                rect.Width, rect.Height, PixelFormat.Format32bppArgb);
            Graphics g = Graphics.FromImage(bmp);

            IntPtr gHdc = g.GetHdc();
            IntPtr deskHandle = NativeMethods.GetDesktopWindow();

            IntPtr dHdc = NativeMethods.GetDC(deskHandle);
            NativeMethods.BitBlt(
                gHdc,
                0,
                0,
                Width,
                Height,
                dHdc,
                0,
                0,
                NativeMethods.TernaryRasterOperations.SRCCOPY);
            NativeMethods.ReleaseDC(deskHandle, dHdc);
            g.ReleaseHdc(gHdc);
            return bmp;
        }

        private Rectangle GetSelectImageRect(Point endPoint)
        {
            _selectImageBounds = Rectangle.FromLTRB(
                _mouseDownPoint.X,
                _mouseDownPoint.Y,
                endPoint.X,
                endPoint.Y);

            return ImageBoundsToRect(_selectImageBounds);
        }

        private void CalCulateSizeGripRect()
        {
            Rectangle rect = SelectImageRect;

            int x = rect.X;
            int y = rect.Y;
            int centerX = x   rect.Width / 2;
            int centerY = y   rect.Height / 2;

            Dictionary<SizeGrip,Rectangle> list = SizeGripRectList;
            list.Clear();

            list.Add(
                SizeGrip.TopLeft,
                new Rectangle(x - 2, y - 2, 5, 5));
            list.Add(
                SizeGrip.TopRight,
                new Rectangle(rect.Right - 2, y - 2, 5, 5));
            list.Add(
                SizeGrip.BottomLeft,
                new Rectangle(x - 2, rect.Bottom - 2, 5, 5));
            list.Add(
                SizeGrip.BottomRight,
                new Rectangle(rect.Right - 2, rect.Bottom - 2, 5, 5));
            list.Add(
                SizeGrip.Top,
                new Rectangle(centerX - 2, y - 2, 5, 5));
            list.Add(
                SizeGrip.Bottom, 
                new Rectangle(centerX - 2, rect.Bottom - 2, 5, 5));
            list.Add(
                SizeGrip.Left,
                new Rectangle(x - 2, centerY - 2, 5, 5));
            list.Add(
                SizeGrip.Right,
                new Rectangle(rect.Right - 2, centerY - 2, 5, 5));
        }

        private void SetSizeGrip(Point point)
        {
            SizeGrip = SizeGrip.None;
            foreach (SizeGrip sizeGrip in SizeGripRectList.Keys)
            {
                if (SizeGripRectList[sizeGrip].Contains(point))
                {
                    SizeGrip = sizeGrip;
                    break;
                }
            }

            if (SizeGrip == SizeGrip.None)
            {
                if (SelectImageRect.Contains(point))
                {
                    SizeGrip = SizeGrip.All;
                }
            }

            switch (SizeGrip)
            {
                case SizeGrip.TopLeft:
                case SizeGrip.BottomRight:
                    Cursor = Cursors.SizeNWSE;
                    break;
                case SizeGrip.TopRight:
                case SizeGrip.BottomLeft:
                    Cursor = Cursors.SizeNESW;
                    break;
                case SizeGrip.Top:
                case SizeGrip.Bottom:
                    Cursor = Cursors.SizeNS;
                    break;
                case SizeGrip.Left:
                case SizeGrip.Right:
                    Cursor = Cursors.SizeWE;
                    break;
                case SizeGrip.All:
                    Cursor = Cursors.SizeAll;
                    break;
                default:
                    Cursor = SelectCursor;
                    break;
            }
        }

        private void ChangeSelctImageRect(Point point)
        {
            Rectangle rect = _selectImageBounds;
            int left = rect.Left;
            int top = rect.Top;
            int right = rect.Right;
            int bottom = rect.Bottom;
            bool sizeGripAll = false;

            switch (SizeGrip)
            {
                case SizeGrip.All:
                    rect.Offset(
                        point.X - _mouseDownPoint.X, point.Y - _mouseDownPoint.Y);
                    sizeGripAll = true;
                    break;
                case SizeGrip.TopLeft:
                    left = point.X;
                    top = point.Y;
                    break;
                case SizeGrip.TopRight:
                    right = point.X;
                    top = point.Y;
                    break;
                case SizeGrip.BottomLeft:
                    left = point.X;
                    bottom = point.Y;
                    break;
                case SizeGrip.BottomRight:
                    right = point.X;
                    bottom = point.Y;
                    break;
                case SizeGrip.Top:
                    top = point.Y;
                    break;
                case SizeGrip.Bottom:
                    bottom = point.Y;
                    break;
                case SizeGrip.Left:
                    left = point.X;
                    break;
                case SizeGrip.Right:
                    right = point.X;
                    break;
            }

            //_selectImageBounds = rect;
            if (!sizeGripAll)
            {
                rect.X = left;
                rect.Y = top;
                rect.Width = right - left;
                rect.Height = bottom - top;
            }
            _mouseDownPoint = point;
            _selectImageBounds = rect;
            SelectImageRect = ImageBoundsToRect(rect); ;
        }

        private Rectangle ImageBoundsToRect(Rectangle bounds)
        {
            Rectangle rect = bounds;
            int x = 0;
            int y = 0;

            x = Math.Min(rect.X, rect.Right);
            y = Math.Min(rect.Y, rect.Bottom);

            rect.X = x;
            rect.Y = y;
            rect.Width = Math.Max(1, Math.Abs(rect.Width));
            rect.Height = Math.Max(1, Math.Abs(rect.Height));
            return rect;
        }

        private void ResetSelectImage()
        {
            SelectedImage = false;
            _selectImageBounds = Rectangle.Empty;
            SelectImageRect = Rectangle.Empty;
            SizeGrip = SizeGrip.None;

            HideDrawToolsControl();
            if (textBox.Visible)
            {
                HideTextBox();
            }
            OperateManager.Clear();
            base.Invalidate();
        }

        private void ShowDrawToolsControl()
        {
            Rectangle rect = SelectImageRect;
            Rectangle screenBounds = Screen.GetBounds(this);
            int x = rect.Right - drawToolsControl.Width - 2;
            int y = 0;
            DrawToolsDockStyle dockStyle = DrawToolsDockStyle.None;

            if (rect.Bottom   drawToolsControl.Height   2 <= screenBounds.Bottom)
            {
                y = rect.Bottom   2;
                dockStyle = DrawToolsDockStyle.Bottom;
            }
            else if (rect.Y - drawToolsControl.Height - 2 >= screenBounds.Top)
            {
                y = rect.Y - drawToolsControl.Height - 2;
                dockStyle = DrawToolsDockStyle.Top;
            }
            else
            {
                y = rect.Bottom - drawToolsControl.Height - 2;
                dockStyle = DrawToolsDockStyle.BottomUp;
            }

            drawToolsControl.DrawToolsDockStyle = dockStyle;
            drawToolsControl.Location = new Point(x, y);
            drawToolsControl.Visible = true;
        }

        private void HideDrawToolsControl()
        {
            drawToolsControl.Visible = false;
            drawToolsControl.ResetDrawStyle();

            HideColorSelector();
        }

        private void ShowColorSelector()
        {
            int x = 0;
            int y = 0;

            Rectangle rect = drawToolsControl.Bounds;
            Rectangle screenBounds = Screen.GetBounds(this);

            switch (drawToolsControl.DrawToolsDockStyle)
            {
                case DrawToolsDockStyle.Top:
                case DrawToolsDockStyle.BottomUp:
                    x = rect.X;
                    y = rect.Y - colorSelector.Height - 2;
                    break;
                case DrawToolsDockStyle.Bottom:
                    x = rect.X;
                    y = rect.Bottom   2;
                    break;
            }

            colorSelector.Location = new Point(x, y);
            colorSelector.Visible = true;
        }

        private void HideColorSelector()
        {
            if (colorSelector.Visible)
            {
                colorSelector.Visible = false;
                colorSelector.Reset();
            }
        }

        /// <summary>
        /// 显示添加文字的输入框
        /// </summary>
        private void ShowTextBox()
        {
            if (SelectImageRect.Contains(_mouseDownPoint))
            {
                Rectangle bounds = ImageBoundsToRect(
                    Rectangle.FromLTRB(
                    _mouseDownPoint.X,
                    _mouseDownPoint.Y,
                    _endPoint.X,
                    _endPoint.Y));

                bounds.Inflate(-1, -1);
                textBox.Bounds = bounds;
                textBox.Text = "";
                textBox.ForeColor = SelectedColor;
                textBox.Font = new Font(
                   textBox.Font.FontFamily,
                   (float)FontSize);
                textBox.Visible = true;
                textBox.Focus();
            }
        }

        /// <summary>
        /// 隐藏添加文字的输入框
        /// </summary>
        private void HideTextBox()
        {
            textBox.Visible = false;
            textBox.Text = string.Empty;
        }

        private void AddOperate(Point point)
        {
            if (!SelectImageRect.Contains(_mouseDownPoint))
            {
                return;
            }

            Color color = SelectedColor;
            switch (DrawStyle)
            {
                case DrawStyle.Rectangle:
                    OperateManager.AddOperate(
                        OperateType.DrawRectangle,
                        color,
                        ImageBoundsToRect(Rectangle.FromLTRB(
                        _mouseDownPoint.X,
                        _mouseDownPoint.Y,
                        point.X,
                        point.Y)));
                    break;
                case DrawStyle.Ellipse:
                    OperateManager.AddOperate(
                       OperateType.DrawEllipse,
                       color,
                       ImageBoundsToRect(Rectangle.FromLTRB(
                       _mouseDownPoint.X,
                       _mouseDownPoint.Y,
                       point.X,
                       point.Y)));
                    break;
                case DrawStyle.Arrow:
                    Point[] points = new Point[] { _mouseDownPoint, point };
                    OperateManager.AddOperate(
                        OperateType.DrawArrow,
                        color,
                        points);
                    break;
                case DrawStyle.Text:
                    ShowTextBox();
                    Rectangle textRect = ImageBoundsToRect(Rectangle.FromLTRB(
                       _mouseDownPoint.X,
                       _mouseDownPoint.Y,
                       point.X,
                       point.Y));
                    DrawTextData textData = new DrawTextData(
                        string.Empty,
                        base.Font,
                        textRect);

                    OperateManager.AddOperate(
                        OperateType.DrawText,
                        color,
                        textData);
                    break;
                case DrawStyle.Line:
                    if (LinePointList.Count < 2)
                    {
                        return;
                    }
                    OperateManager.AddOperate(
                        OperateType.DrawLine, 
                        color, 
                        LinePointList.ToArray());
                    LinePointList.Clear();
                    break;
            }
        }

        private void ClipCursor(bool reset)
        {
            Rectangle rect;
            if (reset)
            {
                rect = Screen.GetBounds(this);
            }
            else
            {
                rect = SelectImageRect;
            }

            NativeMethods.RECT nativeRect = new NativeMethods.RECT(rect);
            NativeMethods.ClipCursor(ref nativeRect);
        }

        #endregion

        /// <summary>
        /// 键盘事件响应
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CaptureImageTool_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                //按下ESC,首先退出右键菜单,再退出截图
                if (contextMenuStripVisible)
                {
                    contextMenuStrip.Hide();
                    contextMenuStripVisible = false;
                }
                else
                {
                    DialogResult = DialogResult.Cancel;
                    this.Close();
                }
            }
        }

        /// <summary>
        /// 右键菜单是否显示状态
        /// </summary>
        private bool contextMenuStripVisible = false;
    }
}

标签: QQ 截图 C#

实例下载地址

C# 仿qq截图功能 例子完整源码下载

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

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

网友评论

第 1 楼 普有才 发表于: 2021-03-03 23:13 14
用不了,win10 会放大屏幕

支持(0) 盖楼(回复)

发表评论

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

查看所有1条评论>>

小贴士

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

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

关于好例子网

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

;
报警