Maison > Article > développement back-end > Exemple d'opération C# pour implémenter la fonction de capture d'écran
Cet article est un petit exemple de développement d'un logiciel de capture d'écran utilisant C# pour l'apprentissage et le partage.
Idées :
Prenez des photos d'écran.
Obtenez la plage à intercepter, c'est-à-dire les coordonnées du coin supérieur gauche et du coin inférieur droit
et remplissez-les dans la PictureBox.
Fonction pinceau, surligneur, rectangle, gomme, fonction copie, sauvegarde
Points de connaissances impliqués :
MenuStrip : Fournit un système de menus pour le formulaire. Prenez ToolStripMenuItem comme sous-option de menu
ToolStrip : fournit un conteneur pour les objets de la barre d'outils Windows. Prenez ToolStripButton [représentant une option facultative contenant du texte et des images] comme sous-élément de la barre d'outils
PictureBox : représente le contrôle de zone d'image Windows utilisé pour afficher les images. Cependant, cet article réécrit cet espace
Écran : peut être utilisé pour obtenir la zone de l'écran de travail
Graphique : encapsule une surface de dessin GDI+. Cette classe ne peut pas être héritée. La méthode CopyFromScreen de cette classe est utilisée pour obtenir l'image d'écran
Événements de souris : y compris les événements MouseDown, MouseMove et MouseUp, et obtenir la position de la souris via l'emplacement dans MouseEventArgs.
Presse-papiers : fournit des méthodes pour placer et récupérer des données à partir du presse-papiers du système. Cette classe ne peut pas être héritée.
Curseur : Définissez le style du curseur affiché par la souris.
OnPaint : Événement Redraw, répondez à cet événement lorsque le contrôle se rafraîchit.
Le rendu est le suivant [implémente principalement des fonctions telles que les captures d'écran, l'enregistrement, la copie, le dessin de rectangles, les traits, les surligneurs, les gommes, etc.] :
L'image enregistrée est la suivante :
--------------------- ----- --------------------------------------------- ----- --------------------------------------------- ----- -
Le code de base est le suivant :
Capturer l'image d'écran :
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 }
Fonction de dessin graphique :
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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!