自制完全仿QQ截图工具抢鲜版,免费下载试用
公司里不知道搞了网络什么限制,我这个机器自古以来上午都登不上腾讯QQ客户端,每次都是上午用WebQQ,中午吃完饭回来才能登客户端。WebQQ用起来慢,而且卡不说,有时候截个图都没有客户端来的便捷。从网上虽然下载了一些截图软件,用起来都不大方便,摸索着自己从网上找了些关于C#截图方面的核心代码(from:http://blog.csdn.net/crystal_lz/article/details/8274277),打造了一款属于自己的Winform截图工具。
自己做的这款截图工具自我感觉用起来挺好的,大概介绍下使用方法,抓图的过程和其他的一样,抓完图后,双击左键复制到粘贴板,也可以在菜单里面操作,按ESC退出当前截图。
先上个主界面和截图界面如下(截图软件就这么简单,自己闲来没事,在winform上模仿了个百度搜索,虽然画蛇添足,放上去后感觉给界面还添加了点灵气……):
下面分享下核心代码:
- 左键按下开始绘图代码
1 /// <summary> 2 /// 按下左键开始绘制 3 /// </summary> 4 private void imageProcessBox1_MouseDown(object sender, MouseEventArgs e) { 5 if (imageProcessBox1.Cursor != Cursors.SizeAll && 6 imageProcessBox1.Cursor != Cursors.Default) 7 panel1.Visible = false; //表示改变选取大小 隐藏工具条 8 //若果在选取类点击 并且有选择工具 9 if (e.Button == MouseButtons.Left && imageProcessBox1.IsDrawed && HaveSelectedToolButton()) { 10 if (imageProcessBox1.SelectedRectangle.Contains(e.Location)) { 11 m_ptOriginal = e.Location; 12 if (tBtn_Text.IsSelected) { //如果选择的是绘制文本 弹出文本框 13 textBox1.Location = e.Location; 14 textBox1.Visible = true; 15 textBox1.Focus(); 16 return; 17 } 18 m_isStartDraw = true; 19 Cursor.Clip = imageProcessBox1.SelectedRectangle; 20 } 21 } 22 }
- 移动鼠标开始截图代码
1 /// <summary> 2 /// 移动鼠标获取截图区域 3 /// </summary> 4 private void imageProcessBox1_MouseMove(object sender, MouseEventArgs e) { 5 m_ptCurrent = e.Location; 6 //根据是否选择有工具决定 鼠标指针样式 7 if (imageProcessBox1.SelectedRectangle.Contains(e.Location) && HaveSelectedToolButton() && imageProcessBox1.IsDrawed) 8 this.Cursor = Cursors.Cross; 9 else if (!imageProcessBox1.SelectedRectangle.Contains(e.Location)) 10 this.Cursor = Cursors.Default; 11 12 if (imageProcessBox1.IsStartDraw && panel1.Visible) //在重置选取的时候 重置工具条位置(成立于移动选取的时候) 13 this.SetToolBarLocation(); 14 15 if (m_isStartDraw) { //如果在区域内点下那么绘制相应图形 16 using (Graphics g = Graphics.FromImage(m_bmpLayerShow)) { 17 int tempWidth = 1; 18 if (toolButton2.IsSelected) tempWidth = 3; 19 if (toolButton3.IsSelected) tempWidth = 5; 20 Pen p = new Pen(colorBox1.SelectedColor, tempWidth); 21 22 #region 绘制矩形 23 24 if (tBtn_Rect.IsSelected) { 25 int tempX = e.X - m_ptOriginal.X > 0 ? m_ptOriginal.X : e.X; 26 int tempY = e.Y - m_ptOriginal.Y > 0 ? m_ptOriginal.Y : e.Y; 27 g.Clear(Color.Transparent); 28 g.DrawRectangle(p, tempX - imageProcessBox1.SelectedRectangle.Left, tempY - imageProcessBox1.SelectedRectangle.Top, Math.Abs(e.X - m_ptOriginal.X), Math.Abs(e.Y - m_ptOriginal.Y)); 29 imageProcessBox1.Invalidate(); 30 } 31 32 #endregion 33 34 #region 绘制圆形 35 36 if (tBtn_Ellipse.IsSelected) { 37 g.DrawLine(Pens.Red, 0, 0, 200, 200); 38 g.Clear(Color.Transparent); 39 g.DrawEllipse(p, m_ptOriginal.X - imageProcessBox1.SelectedRectangle.Left, m_ptOriginal.Y - imageProcessBox1.SelectedRectangle.Top, e.X - m_ptOriginal.X, e.Y - m_ptOriginal.Y); 40 imageProcessBox1.Invalidate(); 41 } 42 43 #endregion 44 45 #region 绘制箭头 46 47 if (tBtn_Arrow.IsSelected) { 48 g.Clear(Color.Transparent); 49 System.Drawing.Drawing2D.AdjustableArrowCap lineArrow = 50 new System.Drawing.Drawing2D.AdjustableArrowCap(4, 4, true); 51 p.CustomEndCap = lineArrow; 52 g.DrawLine(p, (Point)((Size)m_ptOriginal - (Size)imageProcessBox1.SelectedRectangle.Location), (Point)((Size)m_ptCurrent - (Size)imageProcessBox1.SelectedRectangle.Location)); 53 imageProcessBox1.Invalidate(); 54 } 55 56 #endregion 57 58 #region 绘制线条 59 60 if (tBtn_Brush.IsSelected) { 61 Point ptTemp = (Point)((Size)m_ptOriginal - (Size)imageProcessBox1.SelectedRectangle.Location); 62 p.LineJoin = System.Drawing.Drawing2D.LineJoin.Round; 63 g.DrawLine(p, ptTemp, (Point)((Size)e.Location - (Size)imageProcessBox1.SelectedRectangle.Location)); 64 m_ptOriginal = e.Location; 65 imageProcessBox1.Invalidate(); 66 } 67 68 #endregion 69 70 p.Dispose(); 71 } 72 } 73 }
-
保存到粘贴板
1 //将图像保存到剪贴板 2 private void tBtn_Finish_Click(object sender, EventArgs e) { 3 Clipboard.SetImage(m_bmpLayerCurrent); 4 this.Close(); 5 }
-
保存图片到硬盘
1 private void tBtn_Save_Click(object sender, EventArgs e) { 2 SaveFileDialog saveDlg = new SaveFileDialog(); 3 saveDlg.Filter = "位图(*.bmp)|*.bmp|JPEG(*.jpg)|*.jpg"; 4 saveDlg.FilterIndex = 1; 5 saveDlg.FileName = "CAPTURE_" + GetTimeString(); 6 if (saveDlg.ShowDialog() == DialogResult.OK) { 7 switch (saveDlg.FilterIndex) { 8 case 1: 9 m_bmpLayerCurrent.Clone(new Rectangle(0, 0, m_bmpLayerCurrent.Width, m_bmpLayerCurrent.Height), 10 System.Drawing.Imaging.PixelFormat.Format24bppRgb).Save(saveDlg.FileName, 11 System.Drawing.Imaging.ImageFormat.Bmp); 12 this.Close(); 13 break; 14 case 2: 15 m_bmpLayerCurrent.Save(saveDlg.FileName, 16 System.Drawing.Imaging.ImageFormat.Jpeg); 17 this.Close(); 18 break; 19 } 20 } 21 }
技术交流QQ群:70762253正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!
希望能和在读此文的朋友们碰撞一些激情的火花,此公众号会不定时推送一些属于我们程序员的有用信息与优质内容,欢迎关注交流!
作者:施瓦小辛格
出处:http://www.cnblogs.com/wenyang-rio/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
出处:http://www.cnblogs.com/wenyang-rio/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。