第一次寫博客,文筆較差,將就看吧
日常生活中會經常使用到截屏功能,使用最多的無非就是Windows自帶的截圖工具、QQ截圖和PrintScreen鍵,但要達到截圖到word或保存到文件,需要鼠標選擇多次。比如我們想截圖並將圖插入到Word中,不需要保存圖片,我們希望直接點擊截圖按鈕,選擇截圖區域,Ctrl+V簡單三步就行了(感覺說了好多廢話),切入正題。
1.基本功能
選擇屏幕區域后提醒你保存所截的圖片,或直接將所截圖片放到剪切板里(以便用Ctrl+V粘貼)。
2.界面設計
界面很簡單,無非就是可實現以上功能的兩個按鈕和其他文字,見圖:
界面的屬性需要注意幾個問題:
1)窗口設為固定大小,並禁用窗口最大化(因為我們不希望窗口大小會變)
2)窗口最好設為頂置
3)把兩個文字label和兩個按鈕都放到一個panel里,以便於后面程序對控件屬性的操作
4)那么大的按鈕,最好改變一下它的樣式,還可以設置背景為gif動圖
3.功能實現
那么關鍵問題來了,怎么截圖呢?見下圖
原理其實很簡單,就是在點擊按鈕后,窗口變為全屏覆蓋在屏幕最上方,並變為半透明,使你能看到窗口下面的屏幕內容,然后拖動鼠標(此時其實是在軟件的主窗口上拖動,這樣就方便程序捕捉鼠標坐標了),根據坐標在屏幕上繪制選框,接着松開鼠標后,根據鼠標落下和松開的坐標,截取屏幕,最后保存或復制到剪切板。
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 }