zoukankan      html  css  js  c++  java
  • C# 实现截图软件功能

    本文是利用C# 开发截图软件的小例子,以供学习分享使用。

    思路:

    1. 截取屏幕图片。
    2. 获取要截取的范围,即左上角,右下角坐标
    3. 填充到PictureBox中。
    4. 笔触功能,荧光笔,矩形,橡皮擦,复制,保存功能

    涉及的知识点:

    • MenuStrip:为窗体提供菜单系统。以ToolStripMenuItem为菜单子选项
    • ToolStrip:为 Windows 工具栏对象提供容器。以ToolStripButton【表示包含文本和图像的可选】为工具栏子元素
    • PictureBox:表示用于显示图像的 Windows 图片框控件。不过本文对此空间进行了重写
    • Screen:可用于获取工作屏幕区域
    • Graphics:封装一个 GDI+ 绘图图面。此类不能被继承。此类的CopyFromScreen方法用于获取屏幕图像
    • 鼠标事件:包括MouseDown,MouseMove,MouseUp事件,通过MouseEventArgs中的Location获取鼠标的位置。
    • Clipboard: 提供将数据置于系统剪贴板中以及从中检索数据的方法。此类不能被继承。
    • Cursor:设置鼠标的显示的光标的样式。
    • OnPaint:重绘事件,当控件刷新时响应此事件。

    效果图

    如下【主要实现了截图,保存,复制,画矩形,笔触,荧光笔,橡皮擦等功能】:

    保存后图片如下:

    -------------------------------------------------------------------------------------------------------------------------------

    核心代码如下:

    截取屏幕图像:

     1 public Bitmap GetScreen()
     2         {
     3             //获取整个屏幕图像,不包括任务栏
     4             Rectangle ScreenArea = Screen.GetWorkingArea(this);
     5             Bitmap bmp = new Bitmap(ScreenArea.Width, ScreenArea.Height);
     6             using (Graphics g = Graphics.FromImage(bmp))
     7             {
     8                 g.CopyFromScreen(0, 0, 0, 0, new Size(ScreenArea.Width,ScreenArea.Height));
     9             }
    10             return bmp;
    11         }
    View Code

    绘制图形功能:

      1 #region 绘制功能
      2 
      3         protected override void OnPaint(PaintEventArgs pe)
      4         {
      5             base.OnPaint(pe);
      6             Graphics g = pe.Graphics;
      7             DrawHistory(g);
      8             //绘制当前线
      9             if (startDraw && this.curLine.PointList != null && this.curLine.PointList.Count > 0)
     10             {
     11                 DrawLine(g,this.curLine);
     12             }
     13             if (startDraw && this.curRect.Start != null && this.curRect.End != null && this.curRect.Start != this.curRect.End) {
     14                 DrawRectangle(g, this.curRect);
     15             }
     16         }
     17 
     18         public void DrawHistory(Graphics g) {
     19             //绘制线历史记录
     20             if (LineHistory != null)
     21             {
     22                 foreach (HLine lh in LineHistory)
     23                 {
     24                     if (lh.PointList.Count > 10)
     25                     {
     26                         DrawLine(g, lh);
     27                     }
     28                 }
     29             }
     30             //绘制矩形历史记录
     31             if (RectHistory != null)
     32             {
     33                 foreach (HRectangle lh in RectHistory)
     34                 {
     35                     if (lh.Start!=null&& lh.End!=null && lh.Start!=lh.End)
     36                     {
     37                         DrawRectangle(g, lh);
     38                     }
     39                 }
     40             }
     41         }
     42 
     43         /// <summary>
     44         /// 绘制线
     45         /// </summary>
     46         /// <param name="g"></param>
     47         /// <param name="line"></param>
     48         private void DrawLine(Graphics g,HLine line) {
     49             g.SmoothingMode = SmoothingMode.AntiAlias;
     50             using (Pen p = new Pen(line.LineColor, line.LineWidth))
     51             {
     52                 //设置起止点线帽  
     53                 p.StartCap = LineCap.Round;
     54                 p.EndCap = LineCap.Round;
     55 
     56                 //设置连续两段的联接样式  
     57                 p.LineJoin = LineJoin.Round;
     58                 g.DrawCurve(p, line.PointList.ToArray()); //画平滑曲线  
     59             }
     60         }
     61 
     62         /// <summary>
     63         /// 绘制矩形
     64         /// </summary>
     65         /// <param name="g"></param>
     66         /// <param name="rect"></param>
     67         private void DrawRectangle(Graphics g, HRectangle rect)
     68         {
     69             g.SmoothingMode = SmoothingMode.AntiAlias;
     70             using (Pen p = new Pen(rect.LineColor, rect.LineWidth))
     71             {
     72                 //设置起止点线帽  
     73                 p.StartCap = LineCap.Round;
     74                 p.EndCap = LineCap.Round;
     75 
     76                 //设置连续两段的联接样式  
     77                 p.LineJoin = LineJoin.Round;
     78                 g.DrawRectangle(p, rect.Start.X, rect.Start.Y, rect.End.X - rect.Start.X, rect.End.Y - rect.Start.Y); //画平滑曲线  
     79             }
     80         }
     81 
     82         public void Earser(Point p0)
     83         {
     84             for (int i = lineHistory.Count - 1; i >= 0; i--)
     85             {
     86                 HLine line = lineHistory[i];
     87                 bool flag = false;
     88                 foreach (Point p1 in line.PointList)
     89                 {
     90                     double distance = GetDistance(p0, p1);
     91                     if (Math.Abs(distance) < 6)
     92                     {
     93                         //需要删除
     94                         flag = true;
     95                         break;
     96                     }
     97 
     98                 }
     99                 if (flag)
    100                 {
    101                     lineHistory.RemoveAt(i);
    102                 }
    103             }
    104             //擦除矩形
    105             for (int i = rectHistory.Count - 1; i >= 0; i--)
    106             {
    107                 HRectangle rect = rectHistory[i];
    108                
    109                 if (p0.X>rect.Start.X && p0.X<rect.End.X && p0.Y > rect.Start.Y && p0.Y < rect.End.Y) {
    110                    
    111                     rectHistory.RemoveAt(i);
    112                 }
    113             }
    114         }
    115  
    116         /// <summary>
    117         /// 获取两点之间的距离
    118         /// </summary>
    119         /// <param name="p0"></param>
    120         /// <param name="p1"></param>
    121         /// <returns></returns>
    122         private double GetDistance(Point p0, Point p1) {
    123             return Math.Sqrt(Math.Pow((p0.X - p1.X), 2) + Math.Pow((p0.Y - p1.Y), 2));
    124         }
    125 
    126         #endregion
    View Code


    以下是源码功能连接,需要的朋友可以自行下载。

    源码链接

  • 相关阅读:
    java静态工厂实例
    有道云词典+浏览器开PDF文档=科研者外文阅读福利
    高并发实时性网络视频监控项目实战
    Linux环境下天气预报实现
    2019暑假内容复习
    《分布式与云计算》MOOC第三单元课后测试答案
    安装vivado 2016.1时出错
    N皇后问题的一种解法
    window10下基于anaconda安装tensorflow1.14(cpu版本)
    记一次简单的生产环境Mysql调优
  • 原文地址:https://www.cnblogs.com/hsiang/p/6986621.html
Copyright © 2011-2022 走看看