主窗体上一个截图按钮一个富文本框。点击截图按钮可以进行截图操作
代码如下:
public partial class MainFrm : Form { public MainFrm() { InitializeComponent(); } private void btnCatch_Click(object sender, EventArgs e) { this.Hide();//隐藏当前窗体 System.Threading.Thread.Sleep(500);//让线程睡眠一段时间,窗体消失需要一点时间 ScrenFrm CatchForm = new ScrenFrm(); Bitmap CatchBmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);//新建一个和屏幕大小相同的图片 Graphics g = Graphics.FromImage(CatchBmp); g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height));//保存全屏图片 CatchForm.BackgroundImage = CatchBmp;//将Catch窗体的背景设为全屏时的图片 if (CatchForm.ShowDialog() == DialogResult.OK) {//如果Catch窗体结束,就将剪贴板中的图片放到信息发送框中 IDataObject iData = Clipboard.GetDataObject(); DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Bitmap); if (iData.GetDataPresent(DataFormats.Bitmap)) { richTextBox1.Paste(myFormat); Clipboard.Clear();//清除剪贴板中的对象 } this.Show();//重新显示窗体 } } }
弹出窗体代码如下:
public partial class ScrenFrm : Form { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.SuspendLayout(); // // ScrenFrm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(441, 315); this.DoubleBuffered = true; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Name = "ScrenFrm"; this.Text = "截图"; this.WindowState = System.Windows.Forms.FormWindowState.Maximized; this.Load += new System.EventHandler(this.截图_Load); this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.截图_MouseClick); this.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.截图_MouseDoubleClick); this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.截图_MouseDown); this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.截图_MouseMove); this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.截图_MouseUp); this.ResumeLayout(false); } #endregion public ScrenFrm() { InitializeComponent(); } private Point downPiont = Point.Empty;//记录鼠标摁下的点 private bool catchFinished = false;//用来表示截图是否完成 private bool catchStart = false; //截取开始 private Bitmap originBitmap; //用来保存原始图像 private Rectangle catchRect; //用来保存存取的矩形 private void 截图_Load(object sender, EventArgs e) { originBitmap= new Bitmap(this.BackgroundImage);//BackgroundImage为全屏图片,我们另用变量来保存全屏图片 } private void 截图_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { this.DialogResult = DialogResult.OK; this.Close(); } } private void 截图_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (!catchStart) { catchStart = true; downPiont = new Point(e.X, e.Y); } } } private void 截图_MouseMove(object sender, MouseEventArgs e) { if (catchStart) { Bitmap destBitmap =(Bitmap)originBitmap.Clone(); Point newPoint = new Point(e.X,e.Y); Graphics g = Graphics.FromImage(destBitmap);//在刚才新建的图片上新建一个画板 Pen p = new Pen(Color.Blue, 1); int width = Math.Abs(e.X - downPiont.X), height = Math.Abs(e.Y - downPiont.Y);//获取矩形的长和宽 catchRect = new Rectangle(newPoint.X < downPiont.X ? newPoint.X : downPiont.X, newPoint.Y < downPiont.Y ? newPoint.Y : downPiont.Y, width, height);//保存矩形 g.DrawRectangle(p, catchRect);//将矩形画在这个画板上 g.Dispose();//释放目前的这个画板 p.Dispose(); Graphics g1 = this.CreateGraphics();//重新新建一个Graphics类 //如果之前那个画板不释放,而直接g=this.CreateGraphics()这样的话无法释放掉第一次创建的g,因为只是把地址转到新的g了.如同string一样 g1 = this.CreateGraphics();//在整个全屏窗体上新建画板 g1.DrawImage(destBitmap, new Point(0, 0));//将刚才所画的图片画到这个窗体上 //这个也可以属于二次缓冲技术,如果直接将矩形画在窗体上,会造成图片抖动并且会有无数个矩形. g1.Dispose(); destBitmap.Dispose();//要及时释放,不然内存将会被大量消耗 } } private void 截图_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (catchStart) { catchStart = false; catchFinished = true; } } } private void 截图_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(originBitmap, new Rectangle(0, 0, catchRect.Width, catchRect.Height), catchRect, GraphicsUnit.Pixel); //把orginBmp中的指定部分按照指定大小画在画板上 Clipboard.SetImage(CatchedBmp);//将图片保存到剪贴板 g.Dispose(); catchFinished = false; CatchedBmp.Dispose(); this.DialogResult = DialogResult.OK; this.Close(); } } } }