当前位置:首页 > Windows程序 > 正文

用C#实现的小截屏软件

2021-03-26 Windows程序

第一次写博客,文笔较差,将就看吧

日常生活中会经常使用到截屏功能,使用最多的无非就是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 = GetRealPoint(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 = GetRealPoint(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 = GetRealPoint(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: private Point GetRealPoint(Point position) 124: { 125: position.X -= 0; 126: position.Y -= 0; 127: return position; 128: } 129: } 130: } 131:

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67986.html