C# 控件转截图
-
概述
参考了网上的分享,感觉都不太理想:
1.一个控件内如果包含多个子控件时没有考虑顺序问题;
2.超出控件可显示区域时不能长截图,有滚动条会多余截取了滚动条。
这个随笔旨在解决这2个问题,实现带滚动条时可以长截图,并且给出了在多个子控件的情况下如何控制截图顺序的代码。有用可以点个赞。转载请注明出处,谢谢。
1 /// <summary> 2 /// 绘制整个控件以及子控件 3 /// </summary> 4 /// <param name="parentControl">窗口/控件</param> 5 /// <param name="bitmap">bit图片</param> 6 /// <returns></returns> 7 private static Bitmap DrawToBitmap(this Control parentControl, Bitmap bitmap = null) 8 { 9 //获取整个界面的大小 10 var w = parentControl.DisplayRectangle.Width; 11 var h = parentControl.DisplayRectangle.Height; 12 13 //长截图 14 if (bitmap == null) 15 { 16 bitmap = parentControl.BackgroundImage == null ? new Bitmap(w, h) : new Bitmap(parentControl.BackgroundImage,w,h); 17 } 18 19 if (parentControl.HasChildren) 20 { 21 //绘制控件内容(逆序处理:图层从下开始往上叠取) 22 for (int i = parentControl.Controls.Count - 1; i >= 0; i--) 23 { 24 var subControl = parentControl.Controls[i]; 25 //重新计算图片在bitmap上的位置 26 var newLocation = new Point(subControl.Location.X - parentControl.DisplayRectangle.X, subControl.Location.Y - parentControl.DisplayRectangle.Y); 27 using (Bitmap temp = new Bitmap(subControl.Width, subControl.Height)) 28 using (Graphics g = Graphics.FromImage(bitmap)) 29 { 30 subControl.DrawToBitmap(temp, new Rectangle(new Point(0, 0), subControl.Size)); 31 //递归继续处理在子控件上的控件 32 DrawToBitmap(subControl, temp); 33 //最后绘制到底图上 34 g.DrawImage(temp, new Rectangle(newLocation, subControl.Size)); 35 } 36 } 37 } 38 39 return bitmap; 40 }