C#截图
公司里不知道搞了网络什么限制,我这个机器自古以来上午都登不上腾讯QQ客户端,每次都是上午用WebQQ,中午吃完饭回来才能登客户端。WebQQ用起来慢,而且卡不说,有时候截个图都没有客户端来的便捷。从网上虽然下载了一些截图软件,用起来都不大方便,摸索着自己从网上找了些关于C#截图方面的核心代码,打造了一款属于自己的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 }
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!
http://HdhCmsTestcnblogs测试数据/wenyang-rio/archive/2013/01/23/2865958.html
标签: 分享
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息