在C#中如何实现winform窗体的全屏截图功能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中如何实现winform窗体的全屏截图功能相关的知识,希望对你有一定的参考价值。
参考技术A 你好。当然要实现的第一步是能够获取整个屏幕的位图,记得Win32 API的CreateDC, BitBlt等函数可以使用。于是上网查了下,果然屏幕截图用这些函数。但winform已经可以把API都忘记了,所以得寻找一个无Win32 API的实现方式。综合了网上的实现,以及自己的一些设计,实现思路如下:1. 开始截图时,创建一个与屏幕大小一样的位图,然后用Graphics.CopyFromScreen()把屏幕位图拷贝到该位图上。这是很关键的一步,这样所有的操作就都可以在该位图上进行了,而无实际屏幕无关了。 int width = Screen.PrimaryScreen.Bounds.Width;int height = Screen.PrimaryScreen.Bounds.Height;
Bitmap bmp = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(bmp))
g.CopyFromScreen(0, 0, 0, 0, new Size(width, height));
2. 接下来为了方便在这之上进行截图,有一个很重要的设计实现方式:用全屏幕窗体代替现有真实屏幕,这样就可以把截图过程的所有操作都在那个窗体上实现(该窗体设置成无边框,高宽等于屏幕大小即可),另外为了显示掩蔽效果(只能正常显示选择的部分屏幕内容,而其实部分用一个如半透明层覆盖),就添加一层半透明位置位图。具体代码如下:
public partial class FullScreenForm : Form
private Rectangle rectSelected = Rectangle.Empty;
private bool isClipping = false;
private Bitmap screen;
private Bitmap coverLayer = null;
private Color coverColor;
private Brush rectBrush = null;
c# winForm 等待窗体的实现
最近在做一个项目,需要用到等待窗体,在DevExpress下面有SplashScreen控件可以使用,同时也有ProgressIndicator控件能用,但是如果没有用Dev开发的话,我们就需要自定义一个等待窗体了。
首先,把截图放上来:
实现的功能比较简单,就是在程序处理 一些耗时比较多的代码时,将Loading窗体展示给用户,并在后台进行执行。
这个程序,参考了 网名为 “八哥” 的一个程序,当时我在群里面的时候,感谢他的热情帮助。
现将我的代码贴出来吧,里面用的了委托的概念。大家如果不懂的话,可以百度一下,这里给出几个链接:
http://blog.csdn.net/ggz631047367/article/details/44646233
http://www.runoob.com/csharp/csharp-delegate.html
http://blog.csdn.net/sjj2011/article/details/7835200
http://blog.csdn.net/testcs_dn/article/details/37671513
LoadingControl.cs代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Threading; 10 11 namespace ControlToolsLibrary 12 { 13 public partial class LoadingControl : Form 14 { 15 16 public delegate void mydelegate(); 17 public mydelegate eventMethod; 18 private static LoadingControl pLoading = new LoadingControl(); 19 delegate void SetTextCallback(string title,string caption,string description); 20 delegate void CloseFormCallback(); 21 public LoadingControl() 22 { 23 InitializeComponent(); 24 initLoadintForm(); 25 Thread t = new Thread(new ThreadStart(delegateEventMethod)); 26 t.IsBackground = true; 27 t.Start(); 28 } 29 30 private void LoadingControl_FormClosing(object sender, FormClosingEventArgs e) 31 { 32 if (!this.IsDisposed) 33 { 34 this.Dispose(true); 35 } 36 } 37 38 private void initLoadintForm() { 39 this.ControlBox = false; // 设置不出现关闭按钮 40 this.StartPosition = FormStartPosition.CenterParent; 41 } 42 43 private void delegateEventMethod() 44 { 45 eventMethod(); 46 } 47 48 public static LoadingControl getLoading() 49 { 50 if (pLoading.IsDisposed) 51 { 52 pLoading = new LoadingControl(); 53 return pLoading; 54 } 55 else 56 { 57 return pLoading; 58 } 59 } 60 61 //这种方法演示如何在线程安全的模式下调用Windows窗体上的控件。 62 /// <summary> 63 /// 设置Loading 窗体的 标题title,标签 caption 和描述 description 64 /// </summary> 65 /// <param name="title">窗口的标题[为空时,取默认值]</param> 66 /// <param name="caption">标签(例如:please wait)[为空时,取默认值]</param> 67 /// <param name="description">描述(例如:正在加载资源...)[为空时,取默认值]</param> 68 public void SetCaptionAndDescription(string title,string caption, string description) 69 { 70 if (this.InvokeRequired&&LoadingControl.lbl_caption.InvokeRequired && LoadingControl.lbl_description.InvokeRequired) 71 { 72 SetTextCallback d = new SetTextCallback(SetCaptionAndDescription); 73 this.Invoke(d, new object[] { title,caption, description }); 74 } 75 else 76 { 77 if (!title.Equals("")) { 78 this.Text = title; 79 } 80 if (!caption.Equals("")) 81 { 82 LoadingControl.lbl_caption.Text = caption; 83 } 84 if (!description.Equals("")) { 85 LoadingControl.lbl_description.Text = description; 86 } 87 } 88 } 89 90 public void CloseLoadingForm() 91 { 92 if (this.InvokeRequired) 93 { 94 CloseFormCallback d = new CloseFormCallback(CloseLoadingForm); 95 this.Invoke(d, new object[] { }); 96 } 97 else 98 { 99 if (!this.IsDisposed) 100 { 101 this.Dispose(true); 102 } 103 } 104 } 105 106 public void SetExecuteMethod(mydelegate method) 107 { 108 this.eventMethod += method; 109 } 110 111 112 } 113 }
Form的调用的方法如下:
以上是关于在C#中如何实现winform窗体的全屏截图功能的主要内容,如果未能解决你的问题,请参考以下文章