Form1窗体//截屏按钮
private void tsb_Screenshots_Click(object sender, EventArgs e)
{
Form_Cutpic newCapture = new Form_Cutpic();
Image img = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
Graphics g = Graphics.FromImage(img);
g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size);
newCapture.BackgroundImage = img;
newCapture.Show();
rtb_sent.Paste(); //这里粘贴出来的是上一次次复制的内容~不是这次复制的~,理论上应该这次复制的会把上次复制的内容的覆盖啊~?为什么会这样
//this.rtb_sent.Paste(DataFormats.GetFormat(DataFormats.Bitmap));
}
另一个(截图)窗体Form2
//双击鼠标左键时,保存图片
private void Form_Cutpic_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && CatchFinished)
{
if (CatchRect.Contains(new Point(e.X, e.Y)))
{
Bitmap CatchedBmp = new Bitmap(CatchRect.Width, CatchRect.Height);//新建一个于矩形等大的空白图片
Graphics g = Graphics.FromImage(CatchedBmp);
g.DrawImage(originBmp, new Rectangle(0, 0, CatchRect.Width, CatchRect.Height), CatchRect, GraphicsUnit.Pixel);
//把orginBmp中的指定部分按照指定大小画在画板上
Clipboard.SetImage(CatchedBmp);//将图片保存到剪贴板
//ATAQQaClient.Form_Message.[color=#808000]rtb_sent.Paste();——可以在这里直接把图片传到另一个窗体空间上吗?[/color]
CatchedBmp.Save(@"C:\Documents and Settings\Administrator\My Documents\My Pictures\my.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
g.Dispose();
CatchFinished = false;
this.BackgroundImage = originBmp;
CatchedBmp.Dispose();
this.DialogResult = DialogResult.OK;
this.Close();
}
}
我在做截图~截图窗体所有的代码~
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ATAQQaClient
{
public partial class Form_Cutpic : Form
{
private Point DownPoint = Point.Empty;//记录鼠标按下坐标,用来确定绘图起点
private bool CatchFinished = false;//用来表示是否截图完成
private bool CatchStart = false;//表示截图开始
private Bitmap originBmp;//用来保存原始图像
private Rectangle CatchRect;//用来保存截图的矩形 public Form_Cutpic()
{
InitializeComponent();
} private void Form_Cutpic_Load(object sender, EventArgs e)
{
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
this.UpdateStyles();
//以上两句是为了设置控件样式为双缓冲,这可以有效减少图片闪烁的问题
originBmp = new Bitmap(this.BackgroundImage);//BackgroundImage为全屏图片,我们另用变量来保存全屏图片 } //单击鼠标右键退出截屏操作
private void Form_Cutpic_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
this.DialogResult = DialogResult.OK;
this.Close();
}
lbl_Screenshots.Visible = false;
} //按下鼠标时开始捕获
private void Form_Cutpic_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (!CatchStart)
{//如果捕捉没有开始
CatchStart = true;
DownPoint = new Point(e.X, e.Y);//保存鼠标按下坐标
}
}
} //移动鼠标时,改变截屏区域
private void Form_Cutpic_MouseMove(object sender, MouseEventArgs e)
{
lbl_Screenshots.Visible = true;
if (CatchStart)
{//如果捕捉开始
Bitmap destBmp = (Bitmap)originBmp.Clone();//新建一个图片对象,并让它与原始图片相同
Point newPoint = new Point(DownPoint.X, DownPoint.Y);//获取鼠标的坐标
Graphics g = Graphics.FromImage(destBmp);//在刚才新建的图片上新建一个画板
Pen p = new Pen(Color.Blue, 1);
int width = Math.Abs(e.X - DownPoint.X), height = Math.Abs(e.Y - DownPoint.Y);//获取矩形的长和宽
if (e.X < DownPoint.X)
{
newPoint.X = e.X;
}
if (e.Y < DownPoint.Y)
{
newPoint.Y = e.Y;
}
CatchRect = new Rectangle(newPoint, new Size(width, height));//保存矩形 lbl_Screenshots.Text = "矩形大小" + width.ToString() + "*" + height.ToString() + "\n" + "\n" + "快速双击完成截图";//显示矩形的大小
lbl_Screenshots.Location = new Point(DownPoint.X, DownPoint.Y - 37); //lbl控件位置设置 g.DrawRectangle(p, CatchRect);//将矩形画在这个画板上
g.Dispose();//释放目前的这个画板
p.Dispose();
Graphics g1 = this.CreateGraphics();//重新新建一个Graphics类
//如果之前那个画板不释放,而直接g=this.CreateGraphics()这样的话无法释放掉第一次创建的g,因为只是把地址转到新的g了.如同string一样
g1 = this.CreateGraphics();//在整个全屏窗体上新建画板
g1.DrawImage(destBmp, new Point(0, 0));//将刚才所画的图片画到这个窗体上
//这个也可以属于二次缓冲技术,如果直接将矩形画在窗体上,会造成图片抖动并且会有无数个矩形.
g1.Dispose();
destBmp.Dispose();//要及时释放,不然内存将会被大量消耗
} } //松开鼠标时,确定最终的截屏区域
private void Form_Cutpic_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (CatchStart)
{
CatchStart = false;
CatchFinished = true;
}
} } //双击鼠标左键时,保存图片
private void Form_Cutpic_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && CatchFinished)
{
if (CatchRect.Contains(new Point(e.X, e.Y)))
{
Bitmap CatchedBmp = new Bitmap(CatchRect.Width, CatchRect.Height);//新建一个于矩形等大的空白图片
Graphics g = Graphics.FromImage(CatchedBmp);
g.DrawImage(originBmp, new Rectangle(0, 0, CatchRect.Width, CatchRect.Height), CatchRect, GraphicsUnit.Pixel);
//把orginBmp中的指定部分按照指定大小画在画板上
Clipboard.SetImage(CatchedBmp);//将图片保存到剪贴板
//ATAQQaClient.Form_Message.rtb_sent.Paste();
CatchedBmp.Save(@"C:\Documents and Settings\Administrator\My Documents\My Pictures\my.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
g.Dispose();
CatchFinished = false;
this.BackgroundImage = originBmp;
CatchedBmp.Dispose();
this.DialogResult = DialogResult.OK;
this.Close();
}
} }
}
}
private void tsb_Screenshots_Click(object sender, EventArgs e)
{
Form_Cutpic newCapture = new Form_Cutpic();
Image img = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
Graphics g = Graphics.FromImage(img);
g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size);
newCapture.BackgroundImage = img;
newCapture.Show();
rtb_sent.Paste(); //这里粘贴出来的是上一次次复制的内容~不是这次复制的~,理论上应该这次复制的会把上次复制的内容的覆盖啊~?为什么会这样
//this.rtb_sent.Paste(DataFormats.GetFormat(DataFormats.Bitmap));
}
另一个(截图)窗体Form2
//双击鼠标左键时,保存图片
private void Form_Cutpic_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && CatchFinished)
{
if (CatchRect.Contains(new Point(e.X, e.Y)))
{
Bitmap CatchedBmp = new Bitmap(CatchRect.Width, CatchRect.Height);//新建一个于矩形等大的空白图片
Graphics g = Graphics.FromImage(CatchedBmp);
g.DrawImage(originBmp, new Rectangle(0, 0, CatchRect.Width, CatchRect.Height), CatchRect, GraphicsUnit.Pixel);
//把orginBmp中的指定部分按照指定大小画在画板上
Clipboard.SetImage(CatchedBmp);//将图片保存到剪贴板
//ATAQQaClient.Form_Message.[color=#808000]rtb_sent.Paste();——可以在这里直接把图片传到另一个窗体空间上吗?[/color]
CatchedBmp.Save(@"C:\Documents and Settings\Administrator\My Documents\My Pictures\my.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
g.Dispose();
CatchFinished = false;
this.BackgroundImage = originBmp;
CatchedBmp.Dispose();
this.DialogResult = DialogResult.OK;
this.Close();
}
}
我在做截图~截图窗体所有的代码~
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ATAQQaClient
{
public partial class Form_Cutpic : Form
{
private Point DownPoint = Point.Empty;//记录鼠标按下坐标,用来确定绘图起点
private bool CatchFinished = false;//用来表示是否截图完成
private bool CatchStart = false;//表示截图开始
private Bitmap originBmp;//用来保存原始图像
private Rectangle CatchRect;//用来保存截图的矩形 public Form_Cutpic()
{
InitializeComponent();
} private void Form_Cutpic_Load(object sender, EventArgs e)
{
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
this.UpdateStyles();
//以上两句是为了设置控件样式为双缓冲,这可以有效减少图片闪烁的问题
originBmp = new Bitmap(this.BackgroundImage);//BackgroundImage为全屏图片,我们另用变量来保存全屏图片 } //单击鼠标右键退出截屏操作
private void Form_Cutpic_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
this.DialogResult = DialogResult.OK;
this.Close();
}
lbl_Screenshots.Visible = false;
} //按下鼠标时开始捕获
private void Form_Cutpic_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (!CatchStart)
{//如果捕捉没有开始
CatchStart = true;
DownPoint = new Point(e.X, e.Y);//保存鼠标按下坐标
}
}
} //移动鼠标时,改变截屏区域
private void Form_Cutpic_MouseMove(object sender, MouseEventArgs e)
{
lbl_Screenshots.Visible = true;
if (CatchStart)
{//如果捕捉开始
Bitmap destBmp = (Bitmap)originBmp.Clone();//新建一个图片对象,并让它与原始图片相同
Point newPoint = new Point(DownPoint.X, DownPoint.Y);//获取鼠标的坐标
Graphics g = Graphics.FromImage(destBmp);//在刚才新建的图片上新建一个画板
Pen p = new Pen(Color.Blue, 1);
int width = Math.Abs(e.X - DownPoint.X), height = Math.Abs(e.Y - DownPoint.Y);//获取矩形的长和宽
if (e.X < DownPoint.X)
{
newPoint.X = e.X;
}
if (e.Y < DownPoint.Y)
{
newPoint.Y = e.Y;
}
CatchRect = new Rectangle(newPoint, new Size(width, height));//保存矩形 lbl_Screenshots.Text = "矩形大小" + width.ToString() + "*" + height.ToString() + "\n" + "\n" + "快速双击完成截图";//显示矩形的大小
lbl_Screenshots.Location = new Point(DownPoint.X, DownPoint.Y - 37); //lbl控件位置设置 g.DrawRectangle(p, CatchRect);//将矩形画在这个画板上
g.Dispose();//释放目前的这个画板
p.Dispose();
Graphics g1 = this.CreateGraphics();//重新新建一个Graphics类
//如果之前那个画板不释放,而直接g=this.CreateGraphics()这样的话无法释放掉第一次创建的g,因为只是把地址转到新的g了.如同string一样
g1 = this.CreateGraphics();//在整个全屏窗体上新建画板
g1.DrawImage(destBmp, new Point(0, 0));//将刚才所画的图片画到这个窗体上
//这个也可以属于二次缓冲技术,如果直接将矩形画在窗体上,会造成图片抖动并且会有无数个矩形.
g1.Dispose();
destBmp.Dispose();//要及时释放,不然内存将会被大量消耗
} } //松开鼠标时,确定最终的截屏区域
private void Form_Cutpic_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (CatchStart)
{
CatchStart = false;
CatchFinished = true;
}
} } //双击鼠标左键时,保存图片
private void Form_Cutpic_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && CatchFinished)
{
if (CatchRect.Contains(new Point(e.X, e.Y)))
{
Bitmap CatchedBmp = new Bitmap(CatchRect.Width, CatchRect.Height);//新建一个于矩形等大的空白图片
Graphics g = Graphics.FromImage(CatchedBmp);
g.DrawImage(originBmp, new Rectangle(0, 0, CatchRect.Width, CatchRect.Height), CatchRect, GraphicsUnit.Pixel);
//把orginBmp中的指定部分按照指定大小画在画板上
Clipboard.SetImage(CatchedBmp);//将图片保存到剪贴板
//ATAQQaClient.Form_Message.rtb_sent.Paste();
CatchedBmp.Save(@"C:\Documents and Settings\Administrator\My Documents\My Pictures\my.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
g.Dispose();
CatchFinished = false;
this.BackgroundImage = originBmp;
CatchedBmp.Dispose();
this.DialogResult = DialogResult.OK;
this.Close();
}
} }
}
}
IDataObject data = System.Windows.Forms.Clipboard.GetDataObject();
if (data.GetDataPresent (typeof (Bitmap)))
{photo = (Image)data.GetData (typeof (Bitmap));
}