Maison > développement back-end > Tutoriel C#.Net > Exemple d'opération C# pour implémenter la fonction de capture d'écran

Exemple d'opération C# pour implémenter la fonction de capture d'écran

零下一度
Libérer: 2017-06-23 15:23:19
original
2905 Les gens l'ont consulté

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 :

  1. Prenez des photos d'écran.

  2. Obtenez la plage à intercepter, c'est-à-dire les coordonnées du coin supérieur gauche et du coin inférieur droit

  3. et remplissez-les dans la PictureBox.

  4. 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         }
Copier après la connexion
Afficher le code

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
Copier après la connexion
Afficher le code



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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal