用C#實現的小截屏軟件


第一次寫博客,文筆較差,將就看吧

日常生活中會經常使用到截屏功能,使用最多的無非就是Windows自帶的截圖工具、QQ截圖和PrintScreen鍵,但要達到截圖到word或保存到文件,需要鼠標選擇多次。比如我們想截圖並將圖插入到Word中,不需要保存圖片,我們希望直接點擊截圖按鈕,選擇截圖區域,Ctrl+V簡單三步就行了(感覺說了好多廢話),切入正題。

1.基本功能

選擇屏幕區域后提醒你保存所截的圖片,或直接將所截圖片放到剪切板里(以便用Ctrl+V粘貼)。

2.界面設計

界面很簡單,無非就是可實現以上功能的兩個按鈕和其他文字,見圖:

 

 

{(BD9PRE[I29{E~Z@_(${EG

界面的屬性需要注意幾個問題:

1)窗口設為固定大小,並禁用窗口最大化(因為我們不希望窗口大小會變)

image

image

2)窗口最好設為頂置

image

3)把兩個文字label和兩個按鈕都放到一個panel里,以便於后面程序對控件屬性的操作

4)那么大的按鈕,最好改變一下它的樣式,還可以設置背景為gif動圖

image

3.功能實現

那么關鍵問題來了,怎么截圖呢?見下圖

@OL5@0DX2Z7CSN7SB5U]C0S

原理其實很簡單,就是在點擊按鈕后,窗口變為全屏覆蓋在屏幕最上方,並變為半透明,使你能看到窗口下面的屏幕內容,然后拖動鼠標(此時其實是在軟件的主窗口上拖動,這樣就方便程序捕捉鼠標坐標了),根據坐標在屏幕上繪制選框,接着松開鼠標后,根據鼠標落下和松開的坐標,截取屏幕,最后保存或復制到剪切板。

4.敲代碼吧

 

  1 using System;
  2 using System.Windows.Forms;
  3 using System.Drawing;//繪圖要用
  4 using System.Threading;//延時函數要用
  5 
  6 namespace 截屏
  7 {
  8     public partial class Form1 : Form
  9     {
 10         bool mouseDown = false, havePainted = false;
 11         Point start, end;
 12         Point start1, end1;
 13         Size size = new Size(0, 0);
 14         bool saveFile = true;
 15         public Form1()
 16         {
 17             InitializeComponent();
 18         }
 19 
 20         private void button1_Click(object sender, EventArgs e)
 21         {
 22             ReadyToCaptrue();
 23             saveFile = true;
 24         }
 25 
 26         private void Form1_MouseDown(object sender, MouseEventArgs e)
 27         {
 28             start = e.Location;
 29             mouseDown = true;
 30         }
 31 
 32         private void Form1_MouseUp(object sender, MouseEventArgs e)
 33         {
 34             if (size.Width != 0 && size.Height != 0)
 35             {
 36                 ControlPaint.DrawReversibleFrame(new Rectangle(start1, size), Color.Transparent, FrameStyle.Dashed);
 37                 havePainted = false;
 38             }
 39             end = e.Location;
 40             if (start.X > end.X)
 41             {
 42                 int temp = end.X;
 43                 end.X = start.X;
 44                 start.X = temp;
 45             }
 46 
 47             if (start.Y > end.Y)
 48             {
 49                 int temp = end.Y;
 50                 end.Y = start.Y;
 51                 start.Y = temp;
 52             }
 53             this.Opacity = 0.0;
 54             Thread.Sleep(200);
 55             if (end.X - start.X > 0 && end.Y - start.Y > 0)
 56             {
 57                 Bitmap bit = new Bitmap(end.X - start.X, end.Y - start.Y);
 58                 Graphics g = Graphics.FromImage(bit);
 59                 g.CopyFromScreen(start, new Point(0, 0), bit.Size);
 60                 if (saveFile)
 61                 {
 62                     SaveFileDialog saveFileDialog = new SaveFileDialog();
 63                     saveFileDialog.Filter = "png|*.png|bmp|*.bmp|jpg|*.jpg|gif|*.gif";
 64                     if (saveFileDialog.ShowDialog() != DialogResult.Cancel)
 65                     {
 66                         bit.Save(saveFileDialog.FileName);
 67                     }
 68                 }
 69                 else
 70                 {
 71                     Clipboard.SetImage(bit);
 72                 }
 73                 g.Dispose();
 74             }
 75             this.WindowState = FormWindowState.Normal;
 76             this.FormBorderStyle = FormBorderStyle.FixedSingle;
 77             panel1.Visible = true;
 78             this.Opacity = 1;
 79             mouseDown = false;
 80         }
 81 
 82         private void Form1_MouseMove(object sender, MouseEventArgs e)
 83         {
 84             if (mouseDown)
 85             {
 86                 if (size.Width != 0 && size.Height != 0 && havePainted)
 87                 {
 88                     ControlPaint.DrawReversibleFrame(new Rectangle(start1, size), Color.Transparent, FrameStyle.Dashed);
 89                 }
 90                 end1 = e.Location;
 91                 size.Width = Math.Abs(end1.X - start.X);
 92                 size.Height = Math.Abs(end1.Y - start.Y);
 93                 start1.X = (start.X > end1.X) ? end1.X : start.X;
 94                 start1.Y = (start.Y > end1.Y) ? end1.Y : start.Y;
 95 
 96                 if (size.Width != 0 && size.Height != 0)
 97                 {
 98                     ControlPaint.DrawReversibleFrame(new Rectangle(start1, size), Color.Transparent, FrameStyle.Dashed);
 99                     havePainted = true;
100                 }
101             }
102         }
103 
104         private void button2_Click(object sender, EventArgs e)
105         {
106             ReadyToCaptrue();
107             saveFile = false;
108         }
109 
110         private void Form1_Load(object sender, EventArgs e)
111         {
112 
113         }
114 
115         private void ReadyToCaptrue()
116         {
117             this.Opacity = 0.1;
118             panel1.Visible = false;
119             this.FormBorderStyle = FormBorderStyle.None;
120             this.WindowState = FormWindowState.Maximized;
121         }
122     }
123 }

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM