在上一篇文章中讲了如何获取控件图像,即控件截屏,用控件的DrawToImage可以实现,但这种方法只能获取控件工作区即可见部分的图像,如果控件有滚动条,滚动条以外看不见的那部分又如何截取呢?
这个问题我在国内外网上搜了好久,一直都没有找到方法,今天突然想到了以下办法,解决了我几天来的困扰,在此与大家分享了。
控件中有一个DisplayRectangle属性,这个属性比较有用,它指示的是控件虚拟工作区即包括不可见部分的框区。知道我这个属性后,我就想到了可不可以先把控件工作区Size放大到虚拟工作区那么大,然后再用DrawToImage截屏,截完后再把控件缩放回原来尺寸。按这种方法写完代码后发现还是没法截控件全屏。再仔细想了想,觉得问题可能出在控件放大上,控件放大时如果超过它父控件的大小那是没法放大的,鉴于此,我就把
1.控件的父控件先指向null,
2.再把控件工作区Size放大到虚拟工作区那么大
3.然后再用DrawToImage截屏
4.截完后再把控件缩放回原来尺寸
5.控件的父控件恢复原来值。
写完代码后果真有效,开心啊。
Demo
Control c= uc2.panel1.Parent;
Size s = uc2.panel1.Size;
uc2.panel1.Parent = null;
uc2.panel1.Size = uc2.panel1.DisplayRectangle.Size;
//uc2.panel1.Update();
uc2.panel1.DrawToBitmap(img, new Rectangle(0, 0, uc2.panel1.DisplayRectangle.Width, uc2.panel1.DisplayRectangle.Height));
panel1.BackgroundImage = img;
uc2.Size = s;
uc2.panel1.Parent = c;