c#轻松实现屏幕截图效果

基本原理: 基本截图的功能主要靠响应主窗体的鼠标按下、鼠标移动、鼠标抬起几个事件的功能来实现的。截取的图片区域使用“Label”组件来显示,需要重新实现“Label”组件的“Paint”方法。 左键单击开始截图,右键单击取消截图,双击鼠标左键完成截图,将截取的图片保存到Windows剪贴板中。 添加“Label”组件 工具箱》公共组件》双击“Label”组件,修改组件属性:

Name=lbl_CutImage,

AutoSize=False,

BackColor=Transparent,

Text = “”

“Form1_Load”事件添加代码:

[csharp] view plaincopyprint?01.this.lbl_CutImage.Hide();
this.lbl_CutImage.Hide(); 定义截图功能依赖的基本变量 [csharp] view plaincopyprint?01.#region 截图基本变量
02./// <summary>
03./// 用于判断是否已经开始截图,控制信息框是否显示。
04./// </summary>
05.private bool isCuting;
06./// <summary>
07./// 鼠标按下的点
08./// </summary>
09.private Point beginPoint;
10./// <summary>
11./// 最终确定的绘图基点
12./// </summary>
13.private Point endPoint;
14./// <summary>
15./// 用于记录截图显示区域的大小(包括调整块的区域,调整区域边框宽度2px)
16./// </summary>
17.private Rectangle cutImageRect = new Rectangle(0, 0, 5, 5);
18.#endregion
#region 截图基本变量 /// <summary> /// 用于判断是否已经开始截图,控制信息框是否显示。 /// </summary> private bool isCuting; /// <summary> /// 鼠标按下的点 /// </summary> private Point beginPoint; /// <summary> /// 最终确定的绘图基点 /// </summary> private Point endPoint; /// <summary> /// 用于记录截图显示区域的大小(包括调整块的区域,调整区域边框宽度2px) /// </summary> private Rectangle cutImageRect = new Rectangle(0, 0, 5, 5); #endregion定义枚举类型:更新UI的模式

[csharp] view plaincopyprint?01./// <summary>
02./// 更新UI的模式,用于标记哪些需要显示,哪些需要隐藏;
03./// </summary>
04.[FlagsAttribute]
05.public enum UpdateUIMode : uint
06.{
07. //值得注意的是,如果要使用组合值,那么就不能用连接的数字表示,必须是几何级增长!
08. None = 0,
09. ShowTextPro = 1,
10. ShowPenStyle = 2,
11. ShowToolBox = 4,
12. ShowInfoBox = 8,
13. ShowZoomBox = 16,
14. ShowCutImage = 32,
15. HideTextPro = 64,
16. HidePenStyle = 128,
17. HideToolBox = 256,
18. HideInfoBox = 512
19.}
/// <summary> /// 更新UI的模式,用于标记哪些需要显示,哪些需要隐藏; /// </summary> [FlagsAttribute] public enum UpdateUIMode : uint { //值得注意的是,如果要使用组合值,那么就不能用连接的数字表示,必须是几何级增长! None = 0, ShowTextPro = 1, ShowPenStyle = 2, ShowToolBox = 4, ShowInfoBox = 8, ShowZoomBox = 16, ShowCutImage = 32, HideTextPro = 64, HidePenStyle = 128, HideToolBox = 256, HideInfoBox = 512 } 添加方法:计算并保存截图的区域框的大小

[csharp] view plaincopyprint?01./// <summary>
02./// 计算并保存截图的区域框的大小
03./// </summary>
04.private void SaveCutImageSize(Point beginPoint, Point endPoint)
05.{
06. // 保存最终的绘图基点,用于截取选中的区域
07. this.endPoint = beginPoint;
08.
09. // 计算截取图片的大小
10. int imgWidth = Math.Abs(endPoint.X - beginPoint.X) + 1;
11. int imgHeight = Math.Abs(endPoint.Y - beginPoint.Y) + 1;
12. int lblWidth = imgWidth + 4;
13. int lblHeight = imgHeight + 4;
14.
15. // 设置截图区域的位置和大小
16. this.cutImageRect = new Rectangle(beginPoint.X - 2, beginPoint.Y - 2, lblWidth, lblHeight);
17.}
/// <summary> /// 计算并保存截图的区域框的大小 /// </summary> private void SaveCutImageSize(Point beginPoint, Point endPoint) { // 保存最终的绘图基点,用于截取选中的区域 this.endPoint = beginPoint;

        // 计算截取图片的大小
        int imgWidth = Math.Abs(endPoint.X - beginPoint.X) + 1;
        int imgHeight = Math.Abs(endPoint.Y - beginPoint.Y) + 1;
        int lblWidth = imgWidth + 4;
        int lblHeight = imgHeight + 4;

        // 设置截图区域的位置和大小
        this.cutImageRect = new Rectangle(beginPoint.X - 2, beginPoint.Y - 2, lblWidth, lblHeight);
    }

添加方法:执行截图,将选定区域的图片保存到剪贴板 [csharp] view plaincopyprint?01./// <summary>
02./// 执行截图,将选定区域的图片保存到剪贴板
03./// </summary>
04./// <param name="saveToDisk">
05./// 是否将图片保存到磁盘
06./// </param>
07.private void ExecCutImage(bool saveToDisk, bool uploadImage) //bool saveToDisk = false, bool uploadImage = false
08.{
09. // 如果图片获取区域不可见,则退出保存图片过程
10. if (!this.lbl_CutImage.Visible) { return; }
11. Rectangle srcRect = new Rectangle();
12. srcRect.X = this.lbl_CutImage.Location.X + 2;
13. srcRect.Y = this.lbl_CutImage.Location.Y + 2;
14. srcRect.Width = this.lbl_CutImage.Width - 4;
15. srcRect.Height = this.lbl_CutImage.Height - 4;
16. Rectangle destRect = new Rectangle(0, 0, srcRect.Width, srcRect.Height);
17. Bitmap bmp = new Bitmap(srcRect.Width, srcRect.Height);
18. Graphics g = Graphics.FromImage(bmp);
19. g.DrawImage(this.screenImage, destRect, srcRect, GraphicsUnit.Pixel);
20.
21. Clipboard.SetImage(bmp);
22.
23. ExitCutImage(true);
24.}
/// <summary> /// 执行截图,将选定区域的图片保存到剪贴板 /// </summary> /// <param name="saveToDisk"> /// 是否将图片保存到磁盘 /// </param> private void ExecCutImage(bool saveToDisk, bool uploadImage) //bool saveToDisk = false, bool uploadImage = false { // 如果图片获取区域不可见,则退出保存图片过程 if (!this.lbl_CutImage.Visible) { return; } Rectangle srcRect = new Rectangle(); srcRect.X = this.lbl_CutImage.Location.X + 2; srcRect.Y = this.lbl_CutImage.Location.Y + 2; srcRect.Width = this.lbl_CutImage.Width - 4; srcRect.Height = this.lbl_CutImage.Height - 4; Rectangle destRect = new Rectangle(0, 0, srcRect.Width, srcRect.Height); Bitmap bmp = new Bitmap(srcRect.Width, srcRect.Height); Graphics g = Graphics.FromImage(bmp); g.DrawImage(this.screenImage, destRect, srcRect, GraphicsUnit.Pixel);

        Clipboard.SetImage(bmp);

        ExitCutImage(true);
    }

添加方法:退出截图过程 [csharp] view plaincopyprint?01./// <summary>
02. /// 退出截图过程
03. /// </summary>
04. private void ExitCutImage(bool hideWindow) // = true
05. {
06. this.lbl_CutImage.Visible = false;
07. this.isCuting = false;
08.
09. if (hideWindow)
10. {
11. this.screenImage.Dispose();
12. this.Hide();
13. }
14. }
/// <summary> /// 退出截图过程 /// </summary> private void ExitCutImage(bool hideWindow) // = true { this.lbl_CutImage.Visible = false; this.isCuting = false;

        if (hideWindow)
        {
            this.screenImage.Dispose();
            this.Hide();
        }
    }

主窗口鼠标按下事件处理程序

[csharp] view plaincopyprint?01./// <summary>
02./// 截图窗口鼠标按下事件处理程序
03./// </summary>
04./// <param name="sender"></param>
05./// <param name="e"></param>
06.private void Form1_MouseDown(object sender, MouseEventArgs e)
07.{
08. // 左键单击事件
09. if (e.Button == MouseButtons.Left && e.Clicks == 1)
10. {
11. if (!this.lbl_CutImage.Visible)
12. {
13. this.isCuting = true;
14. this.beginPoint = e.Location;
15. this.endPoint = e.Location;
16. SaveCutImageSize(e.Location, e.Location);
17.
18. UpdateCutInfoLabel(UpdateUIMode.ShowCutImage | UpdateUIMode.ShowInfoBox);
19. }
20. }
21. // 左键双击事件
22. if (e.Button == MouseButtons.Left && e.Clicks == 2)
23. {
24. if (this.lbl_CutImage.Visible)
25. {
26. ExecCutImage(false, false);
27. }
28.
29. }
30. // 右键单击事件
31. if (e.Button == MouseButtons.Right)
32. {
33. ExitCutImage(!this.lbl_CutImage.Visible);
34. }
35.
36.}
/// <summary> /// 截图窗口鼠标按下事件处理程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_MouseDown(object sender, MouseEventArgs e) { // 左键单击事件 if (e.Button == MouseButtons.Left && e.Clicks == 1) { if (!this.lbl_CutImage.Visible) { this.isCuting = true; this.beginPoint = e.Location; this.endPoint = e.Location; SaveCutImageSize(e.Location, e.Location);

                UpdateCutInfoLabel(UpdateUIMode.ShowCutImage | UpdateUIMode.ShowInfoBox);
            }
        }
        // 左键双击事件
        if (e.Button == MouseButtons.Left && e.Clicks == 2)
        {
            if (this.lbl_CutImage.Visible)
            {
                ExecCutImage(false, false);
            }

        }
        // 右键单击事件
        if (e.Button == MouseButtons.Right)
        {
            ExitCutImage(!this.lbl_CutImage.Visible);
        }

    }

主窗口鼠标移动事件处理程序

[csharp] view plaincopyprint?01./// <summary>
02./// 截图窗口鼠标移动事件处理程序
03./// </summary>
04./// <param name="sender"></param>
05./// <param name="e"></param>
06.private void Form1_MouseMove(object sender, MouseEventArgs e)
07.{
08. // 如果截取区域不可见,则退出处理过程
09. if (!this.lbl_CutImage.Visible)
10. {
11. UpdateCutInfoLabel(UpdateUIMode.None);
12. return;
13. }
14.
15. Point pntBgn = this.beginPoint;
16. Point pntEnd = e.Location;
17.
18. // 如果是反向拖动,重新设置起始点
19. if (e.Location.X < this.beginPoint.X && e.Location.Y < this.beginPoint.Y)
20. {
21. pntBgn = e.Location;
22. pntEnd = this.beginPoint;
23. }
24. else
25. {
26. if (e.Location.X < this.beginPoint.X)
27. {
28. pntBgn = new Point(e.Location.X, this.beginPoint.Y);
29. pntEnd = new Point(this.beginPoint.X, e.Location.Y);
30. }
31. else
32. {
33. if (e.Location.Y < this.beginPoint.Y)
34. {
35. pntBgn = new Point(this.beginPoint.X, e.Location.Y);
36. pntEnd = new Point(e.Location.X, this.beginPoint.Y);
37. }
38. }
39. }
40.
41. if (this.isCuting)
42. {
43. SaveCutImageSize(pntBgn, pntEnd);
44. }
45.
46. UpdateCutInfoLabel(UpdateUIMode.None);
47.}
/// <summary> /// 截图窗口鼠标移动事件处理程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_MouseMove(object sender, MouseEventArgs e) { // 如果截取区域不可见,则退出处理过程 if (!this.lbl_CutImage.Visible) { UpdateCutInfoLabel(UpdateUIMode.None); return; }

        Point pntBgn = this.beginPoint;
        Point pntEnd = e.Location;

        // 如果是反向拖动,重新设置起始点
        if (e.Location.X < this.beginPoint.X && e.Location.Y < this.beginPoint.Y)
        {
            pntBgn = e.Location;
            pntEnd = this.beginPoint;
        }
        else
        {
            if (e.Location.X < this.beginPoint.X)
            {
                pntBgn = new Point(e.Location.X, this.beginPoint.Y);
                pntEnd = new Point(this.beginPoint.X, e.Location.Y);
            }
            else
            {
                if (e.Location.Y < this.beginPoint.Y)
                {
                    pntBgn = new Point(this.beginPoint.X, e.Location.Y);
                    pntEnd = new Point(e.Location.X, this.beginPoint.Y);
                }
            }
        }

        if (this.isCuting)
        {
            SaveCutImageSize(pntBgn, pntEnd);
        }

        UpdateCutInfoLabel(UpdateUIMode.None);
    }

主窗口鼠标抬起事件处理程序 [csharp] view plaincopyprint?01./// <summary>
02./// 截图窗口鼠标抬起事件处理程序
03./// </summary>
04./// <param name="sender"></param>
05./// <param name="e"></param>
06.private void Form1_MouseUp(object sender, MouseEventArgs e)
07.{
08. if (e.Button == MouseButtons.Left)
09. {
10. if (this.isCuting)
11. {
12. this.isCuting = false;
13.
14. UpdateCutInfoLabel(UpdateUIMode.None);
15. }
16. }
17.}
/// <summary> /// 截图窗口鼠标抬起事件处理程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (this.isCuting) { this.isCuting = false;

                UpdateCutInfoLabel(UpdateUIMode.None);
            }
        }
    }

截取区域图片绘制 [csharp] view plaincopyprint?01./// <summary>
02./// 截取区域图片的绘制事件处理程序
03./// </summary>
04./// <param name="sender"></param>
05./// <param name="e"></param>
06.private void lbl_CutImage_Paint(object sender, PaintEventArgs e)
07.{
08. int imgWidth = this.lbl_CutImage.Width - 4;
09. int imgHeight = this.lbl_CutImage.Height - 4;
10. if (imgWidth < 1) { imgWidth = 1; }
11. if (imgHeight < 1) { imgHeight = 1; }
12.
13. // 创建缓存图像,先将要绘制的内容全部绘制到缓存中,最后再一次性绘制到 Label 上,
14. // 这样可以提高性能,并且可以防止屏幕闪烁的问题
15. Bitmap bmp_lbl = new Bitmap(this.lbl_CutImage.Width, this.lbl_CutImage.Height);
16. Graphics g = Graphics.FromImage(bmp_lbl);
17.
18. // 将要截取的部分绘制到缓存
19. Rectangle destRect = new Rectangle(2, 2, imgWidth, imgHeight);
20. Point srcPoint = this.lbl_CutImage.Location;
21. srcPoint.Offset(2, 2);
22. Rectangle srcRect = new Rectangle(srcPoint, new System.Drawing.Size(imgWidth, imgHeight));
23. g.DrawImage(this.screenImage, destRect, srcRect, GraphicsUnit.Pixel);
24.
25. SolidBrush brush = new SolidBrush(Color.FromArgb(10, 124, 202));
26. Pen pen = new Pen(brush, 1.0F);
27.
28. //以下部分(边框和调整块)的绘制放在(编辑内容)的后面,是解决绘制编辑内容会覆盖(边框和调整块)的问题
29.
30. // 绘制边框外的区域,解决会被编辑内容覆盖的问题
31. // 上边
32. destRect = new Rectangle(0, 0, this.lbl_CutImage.Width, 2);
33. srcPoint = this.lbl_CutImage.Location;
34. //srcPoint.Offset(2, 2);
35. srcRect = new Rectangle(srcPoint, new System.Drawing.Size(this.lbl_CutImage.Width, 2));
36. g.DrawImage(this.BackgroundImage, destRect, srcRect, GraphicsUnit.Pixel);
37.
38. // 下边
39. destRect = new Rectangle(0, this.lbl_CutImage.Height - 2, this.lbl_CutImage.Width, 2);
40. srcPoint = this.lbl_CutImage.Location;
41. srcPoint.Offset(0, this.lbl_CutImage.Height - 2);
42. srcRect = new Rectangle(srcPoint, new System.Drawing.Size(this.lbl_CutImage.Width, 2));
43. g.DrawImage(this.BackgroundImage, destRect, srcRect, GraphicsUnit.Pixel);
44.
45. // 左边
46. destRect = new Rectangle(0, 2, 2, this.lbl_CutImage.Height - 4);
47. srcPoint = this.lbl_CutImage.Location;
48. srcPoint.Offset(0, 2);
49. srcRect = new Rectangle(srcPoint, new System.Drawing.Size(2, this.lbl_CutImage.Height - 4));
50. g.DrawImage(this.BackgroundImage, destRect, srcRect, GraphicsUnit.Pixel);
51.
52. // 右边
53. destRect = new Rectangle(this.lbl_CutImage.Width - 2, 2, 2, this.lbl_CutImage.Height - 4);
54. srcPoint = this.lbl_CutImage.Location;
55. srcPoint.Offset(this.lbl_CutImage.Width - 2, 2);
56. srcRect = new Rectangle(srcPoint, new System.Drawing.Size(2, this.lbl_CutImage.Height - 4));
57. g.DrawImage(this.BackgroundImage, destRect, srcRect, GraphicsUnit.Pixel);
58.
59. // 绘制边框
60. g.DrawLine(pen, 2, 2, this.lbl_CutImage.Width - 3, 2);
61. g.DrawLine(pen, 2, 2, 2, this.lbl_CutImage.Height - 3);
62. g.DrawLine(pen, this.lbl_CutImage.Width - 3, 2, this.lbl_CutImage.Width - 3, this.lbl_CutImage.Height - 3);
63. g.DrawLine(pen, 2, this.lbl_CutImage.Height - 3, this.lbl_CutImage.Width - 3, this.lbl_CutImage.Height - 3);
64.
65. // 绘制四个角的调整块
66. g.FillRectangle(brush, 0, 0, 4, 5);
67. g.FillRectangle(brush, this.lbl_CutImage.Width - 4, 0, 4, 5);
68. g.FillRectangle(brush, 0, this.lbl_CutImage.Height - 5, 4, 5);
69. g.FillRectangle(brush, this.lbl_CutImage.Width - 4, this.lbl_CutImage.Height - 5, 4, 5);
70.
71. // 绘制中间的四个调整块
72. int blockX = this.lbl_CutImage.Width / 2 - 2;
73. int blockY = this.lbl_CutImage.Height / 2 - 2;
74. g.FillRectangle(brush, blockX, 0, 4, 5);
75. g.FillRectangle(brush, 0, blockY, 4, 5);
76. g.FillRectangle(brush, blockX, this.lbl_CutImage.Height - 5, 4, 5);
77. g.FillRectangle(brush, this.lbl_CutImage.Width - 4, blockY, 4, 5);
78.
79. // 绘制到 Label 上
80. e.Graphics.DrawImage(bmp_lbl, 0, 0);
81. bmp_lbl.Dispose();
82.}
/// <summary> /// 截取区域图片的绘制事件处理程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void lbl_CutImage_Paint(object sender, PaintEventArgs e) { int imgWidth = this.lbl_CutImage.Width - 4; int imgHeight = this.lbl_CutImage.Height - 4; if (imgWidth < 1) { imgWidth = 1; } if (imgHeight < 1) { imgHeight = 1; }

        // 创建缓存图像,先将要绘制的内容全部绘制到缓存中,最后再一次性绘制到 Label 上,
        // 这样可以提高性能,并且可以防止屏幕闪烁的问题
        Bitmap bmp_lbl = new Bitmap(this.lbl_CutImage.Width, this.lbl_CutImage.Height);
        Graphics g = Graphics.FromImage(bmp_lbl);

        // 将要截取的部分绘制到缓存
        Rectangle destRect = new Rectangle(2, 2, imgWidth, imgHeight);
        Point srcPoint = this.lbl_CutImage.Location;
        srcPoint.Offset(2, 2);
        Rectangle srcRect = new Rectangle(srcPoint, new System.Drawing.Size(imgWidth, imgHeight));
        g.DrawImage(this.screenImage, destRect, srcRect, GraphicsUnit.Pixel);

        SolidBrush brush = new SolidBrush(Color.FromArgb(10, 124, 202));
        Pen pen = new Pen(brush, 1.0F);

        //以下部分(边框和调整块)的绘制放在(编辑内容)的后面,是解决绘制编辑内容会覆盖(边框和调整块)的问题

        // 绘制边框外的区域,解决会被编辑内容覆盖的问题
        // 上边
        destRect = new Rectangle(0, 0, this.lbl_CutImage.Width, 2);
        srcPoint = this.lbl_CutImage.Location;
        //srcPoint.Offset(2, 2);
        srcRect = new Rectangle(srcPoint, new System.Drawing.Size(this.lbl_CutImage.Width, 2));
        g.DrawImage(this.BackgroundImage, destRect, srcRect, GraphicsUnit.Pixel);

        // 下边
        destRect = new Rectangle(0, this.lbl_CutImage.Height - 2, this.lbl_CutImage.Width, 2);
        srcPoint = this.lbl_CutImage.Location;
        srcPoint.Offset(0, this.lbl_CutImage.Height - 2);
        srcRect = new Rectangle(srcPoint, new System.Drawing.Size(this.lbl_CutImage.Width, 2));
        g.DrawImage(this.BackgroundImage, destRect, srcRect, GraphicsUnit.Pixel);

        // 左边
        destRect = new Rectangle(0, 2, 2, this.lbl_CutImage.Height - 4);
        srcPoint = this.lbl_CutImage.Location;
        srcPoint.Offset(0, 2);
        srcRect = new Rectangle(srcPoint, new System.Drawing.Size(2, this.lbl_CutImage.Height - 4));
        g.DrawImage(this.BackgroundImage, destRect, srcRect, GraphicsUnit.Pixel);

        // 右边
        destRect = new Rectangle(this.lbl_CutImage.Width - 2, 2, 2, this.lbl_CutImage.Height - 4);
        srcPoint = this.lbl_CutImage.Location;
        srcPoint.Offset(this.lbl_CutImage.Width - 2, 2);
        srcRect = new Rectangle(srcPoint, new System.Drawing.Size(2, this.lbl_CutImage.Height - 4));
        g.DrawImage(this.BackgroundImage, destRect, srcRect, GraphicsUnit.Pixel);

        // 绘制边框
        g.DrawLine(pen, 2, 2, this.lbl_CutImage.Width - 3, 2);
        g.DrawLine(pen, 2, 2, 2, this.lbl_CutImage.Height - 3);
        g.DrawLine(pen, this.lbl_CutImage.Width - 3, 2, this.lbl_CutImage.Width - 3, this.lbl_CutImage.Height - 3);
        g.DrawLine(pen, 2, this.lbl_CutImage.Height - 3, this.lbl_CutImage.Width - 3, this.lbl_CutImage.Height - 3);

        // 绘制四个角的调整块
        g.FillRectangle(brush, 0, 0, 4, 5);
        g.FillRectangle(brush, this.lbl_CutImage.Width - 4, 0, 4, 5);
        g.FillRectangle(brush, 0, this.lbl_CutImage.Height - 5, 4, 5);
        g.FillRectangle(brush, this.lbl_CutImage.Width - 4, this.lbl_CutImage.Height - 5, 4, 5);

        // 绘制中间的四个调整块
        int blockX = this.lbl_CutImage.Width / 2 - 2;
        int blockY = this.lbl_CutImage.Height / 2 - 2;
        g.FillRectangle(brush, blockX, 0, 4, 5);
        g.FillRectangle(brush, 0, blockY, 4, 5);
        g.FillRectangle(brush, blockX, this.lbl_CutImage.Height - 5, 4, 5);
        g.FillRectangle(brush, this.lbl_CutImage.Width - 4, blockY, 4, 5);

        // 绘制到 Label 上
        e.Graphics.DrawImage(bmp_lbl, 0, 0);
        bmp_lbl.Dispose();
    }

双击鼠标左键完成截图功能

[csharp] view plaincopyprint?01./// <summary>
02./// 截取区域图片的鼠标按下事件处理程序
03./// </summary>
04./// <param name="sender"></param>
05./// <param name="e"></param>
06.private void lbl_CutImage_MouseDown(object sender, MouseEventArgs e)
07.{
08. // 左键双击事件
09. if (e.Button == MouseButtons.Left && e.Clicks == 2)
10. {
11. if (this.lbl_CutImage.Visible)
12. {
13. ExecCutImage(false, false);
14. }
15. }
16.}
/// <summary> /// 截取区域图片的鼠标按下事件处理程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void lbl_CutImage_MouseDown(object sender, MouseEventArgs e) { // 左键双击事件 if (e.Button == MouseButtons.Left && e.Clicks == 2) { if (this.lbl_CutImage.Visible) { ExecCutImage(false, false); } } } 注意:代码都贴完了,别忘了为窗体或组件绑定事件处理程序;

例如:截取区域图片的鼠标按下事件处理程序“lbl_CutImage_MouseDown”,就是“lbl_CutImage”组件的“MouseDown”事件的处理程序,绑定方法参考下图:

在此输入图片描述

到此,基本截图的功能实现已经实现,至此可以编译一下,检查源代码是否有错误。 end

转载于:https://my.oschina.net/bigfool007139/blog/392825

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值