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         }

 

posted @ 2024-05-29 17:30  tpen  阅读(68)  评论(0编辑  收藏  举报