>  기사  >  백엔드 개발  >  스크린샷 기능을 구현하기 위한 C# 작업 예제

스크린샷 기능을 구현하기 위한 C# 작업 예제

零下一度
零下一度원래의
2017-06-23 15:23:192817검색

이 문서는 C#을 사용하여 학습 및 공유를 위한 스크린샷 소프트웨어를 개발하는 간단한 예입니다.

아이디어:

  1. 화면 사진을 캡처하세요.

  2. 가로채기할 범위, 즉 왼쪽 상단 모서리와 오른쪽 하단 모서리의 좌표를 가져와

  3. PictureBox에 채웁니다.

  4. 획 기능, 형광펜, 직사각형, 지우개, 복사, 저장 기능

관련 지식:

  • MenuStrip: 양식에 대한 메뉴 시스템을 제공합니다. ToolStripMenuItem을 메뉴 하위 옵션

  • ToolStrip으로 사용: Windows 도구 모음 개체에 대한 컨테이너를 제공합니다. ToolStripButton [텍스트와 이미지가 포함된 선택적 옵션을 나타냄]을 도구 모음 하위 요소

  • PictureBox로 사용: 이미지를 표시하는 데 사용되는 Windows 그림 상자 컨트롤을 나타냅니다. 하지만 이 글은 이 공간을 다시 작성합니다

  • Screen: 작업 화면 영역을 얻는 데 사용할 수 있습니다

  • Graphics: GDI+ 그리기 표면을 캡슐화합니다. 이 클래스는 상속될 수 없습니다. 이 클래스의 CopyFromScreen 메서드는 MouseDown, MouseMove 및 MouseUp 이벤트를 포함한 화면 이미지

  • Mouse 이벤트를 가져오고 MouseEventArgs의 Location을 통해 마우스 위치를 가져오는 데 사용됩니다.

  • 클립보드: 시스템 클립보드에서 데이터를 배치하고 검색하는 방법을 제공합니다. 이 클래스는 상속될 수 없습니다.

  • 커서: 마우스가 표시하는 커서의 스타일을 설정합니다.

  • OnPaint: Redraw 이벤트, 컨트롤이 새로 고쳐지면 이 이벤트에 응답합니다.

효과 사진은 다음과 같습니다. [주로 스크린샷, 저장, 복사, 사각형 그리기, 획, 형광펜, 지우개 등의 기능을 구현]:

저장 후 사진은 다음과 같습니다.

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

핵심 코드는 다음과 같습니다.

화면 이미지 캡처:

 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         }
코드 보기

그래픽 그리기 기능:

  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
코드 보기



위 내용은 스크린샷 기능을 구현하기 위한 C# 작업 예제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.