前两篇,介绍了GDI+的一些基本用法,现在我们来试着实现一个模仿qq截图的功能来加深一下对GDI+的理解和运用。
首先,我们介绍一下思路:
聊天窗体上有一个截图按钮,点击按钮后,程序将整个屏幕画在一个新的全屏窗体上,然后显示这个窗体.因为是全屏的窗体,并且隐藏了菜单栏、工具栏等,所以在我们看来就好像是一个桌面的截图,然后在这个新窗体上画矩形,最后保存矩形中的内容并显示在原来的聊天窗体中.
废话不说,先来上一个我的界面截图
其次,我贴出部分主要代码:
Catch页面:
#region 变量 private Point DownPoint = Point.Empty;//确定绘图起点,按下的坐标 private bool CatchFinished = false;//是否完成截图 private bool CatchStart = false;//是否开始截图 private Bitmap originBmp;//用来保存原始图像 private Rectangle CatchRect;//用来保存截图的矩形 #endregion public Catch() { InitializeComponent(); this.Load += Catch_Load; this.MouseClick += Catch_MouseClick; this.MouseDown += Catch_MouseDown; this.MouseMove += Catch_MouseMove; this.MouseUp += Catch_MouseUp; this.MouseDoubleClick += Catch_MouseDoubleClick; } void Catch_Load(object sender, EventArgs e) { //设置控件样式为双缓冲,以有效减少图片闪烁 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); this.UpdateStyles(); originBmp = new Bitmap(this.BackgroundImage); }
Main页面:
private void btn_screenShot_Click(object sender, EventArgs e) { if (cb_hideCurrent.Checked) { this.Hide(); } Thread.Sleep(1000); Catch catchForm = new Catch(); Bitmap CatchBmp = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].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; if (catchForm.ShowDialog() == DialogResult.OK) { IDataObject iData = Clipboard.GetDataObject(); DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Bitmap); if (iData.GetDataPresent(DataFormats.Bitmap)) { richTextBox1.Paste(myFormat); Clipboard.Clear(); } this.Show(); } }
至此,我们就完成了一个模仿QQ截图的功能,完整的项目文件我放在了GUI+绘图实现截屏功能,欢迎大家下载。
或者关注微信公众号IronMarmot,后台回复“截图”即可。