Heim >Backend-Entwicklung >C#.Net-Tutorial >C#-Operationsbeispiel zur Implementierung der Screenshot-Funktion

C#-Operationsbeispiel zur Implementierung der Screenshot-Funktion

零下一度
零下一度Original
2017-06-23 15:23:192902Durchsuche

Dieser Artikel ist ein kleines Beispiel für die Entwicklung einer Screenshot-Software mit C# zum Lernen und Teilen.

Ideen:

  1. Machen Sie Bildschirmfotos.

  2. Ermitteln Sie den abzufangenden Bereich, also die Koordinaten der oberen linken Ecke und der unteren rechten Ecke

  3. und geben Sie diese in die PictureBox ein.

  4. Pinselfunktion, Textmarker, Rechteck, Radiergummi, Kopieren, Speicherfunktion

Beteiligte Wissenspunkte:

  • MenuStrip: Stellt ein Menüsystem für das Formular bereit. Nehmen Sie ToolStripMenuItem als Menü-Unteroption

  • ToolStrip: Stellt einen Container für Windows-Symbolleistenobjekte bereit. Nehmen Sie ToolStripButton [eine optionale Option mit Text und Bildern] als Unterelement der Symbolleiste

  • PictureBox: stellt das Windows-Bildfeld-Steuerelement dar, das zum Anzeigen von Bildern verwendet wird. Dieser Artikel schreibt diesen Bereich jedoch neu

  • Bildschirm: kann verwendet werden, um den Arbeitsbildschirmbereich zu erhalten

  • Grafiken: kapselt eine GDI+-Zeichenoberfläche. Diese Klasse kann nicht vererbt werden. Die CopyFromScreen-Methode dieser Klasse wird verwendet, um das Bildschirmbild

  • Mausereignisse abzurufen: einschließlich MouseDown-, MouseMove- und MouseUp-Ereignisse, und um die Position der Maus über den Standort in MouseEventArgs zu ermitteln.

  • Zwischenablage: Bietet Methoden zum Platzieren und Abrufen von Daten aus der Systemzwischenablage. Diese Klasse kann nicht vererbt werden.

  • Cursor: Legen Sie den Stil des von der Maus angezeigten Cursors fest.

  • OnPaint: Redraw-Ereignis, reagieren Sie auf dieses Ereignis, wenn das Steuerelement aktualisiert wird.

Das Rendering ist wie folgt [implementiert hauptsächlich Funktionen wie Screenshots, Speichern, Kopieren, Zeichnen von Rechtecken, Strichen, Textmarkern, Radiergummis usw.]:

Das gespeicherte Bild sieht wie folgt aus:

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

Der Kerncode lautet wie folgt:

Bildschirmbild erfassen:

 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         }
Code anzeigen

Funktion zum Zeichnen von Grafiken:

  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
Code anzeigen



Das obige ist der detaillierte Inhalt vonC#-Operationsbeispiel zur Implementierung der Screenshot-Funktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn