C# WinForm控件及其子控件转成图片(支持带滚动条的长截图)

概述(Overview)

参考了网上的分享,感觉都不太理想:1.一个控件内如果包含多个子控件时没有考虑顺序问题;2.超出控件可显示区域时不能长截图,有滚动条会多余截取了滚动条。这个随笔旨在解决这个问题,实现带滚动条时可以长截图,并且给出了在多个子控件的情况下如何控制截图顺序的代码。有用可以点个赞。引用本文章请注明出处,谢谢。

(Referring to the Share on the Internet, I feel that it is not ideal: 1. If there are multiple sub-controls in a control, the order is not considered; 2. When the display area of the control is exceeded, the screenshot cannot be long, and the scroll bar will be redundantly intercepted. This essay aims to solve this problem by implementing long screenshots with scrollbars, and gives code on how to control the order of screenshots in the case of multiple child controls. If it's useful, you can like it. Please indicate the source for citing this article, thank you.)

复制代码
 1         /// <summary>
 2         /// 绘制整个控件以及子控件
 3         /// </summary>
 4         /// <param name="ctrl">窗口/控件</param>
 5         /// <param name="bitmap">bit图片</param>
 6         /// <returns></returns>
 7         private Bitmap DrawToBitmap(Control ctrl, Bitmap bitmap = null)
 8         {
 9             //获取整个界面的大小
10             var w = ctrl.DisplayRectangle.Width;
11             var h = ctrl.DisplayRectangle.Height;
12 
13             //长截图
14             if (bitmap == null)
15             {
16                 bitmap = ctrl.BackgroundImage == null ? new Bitmap(w, h) : new Bitmap(ctrl.BackgroundImage);
17             }
18 
19             if (ctrl.HasChildren)
20             {
21                 //绘制子控件内容(逆序处理:图层从下开始往上叠取)
22                 for (int i = ctrl.Controls.Count - 1; i >= 0; i--)
23                 {
24                     var control = ctrl.Controls[i];
25                     //重新计算图片在bitmap上的位置
26                     var newLocation = new Point(control.Location.X - ctrl.DisplayRectangle.X, control.Location.Y - ctrl.DisplayRectangle.Y);
27 
28                     using (Bitmap temp = new Bitmap(control.Width, control.Height))
29                     using (Graphics g = Graphics.FromImage(bitmap))
30                     {
31                         control.DrawToBitmap(temp, new Rectangle(new Point(0, 0), control.Size));
32                         g.DrawImage(temp, new Rectangle(newLocation, control.Size));
33                     }
34                     DrawToBitmap(control, bitmap);
35                 }
36             }
37 
38             return bitmap;
39         }

Code

引用(Reference)

相关推荐
zlinear数据采集卡10 分钟前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
深澈Vincel3 小时前
我用 C# + WebView2 做了一个针对“流氓软件”的“一键清理工具“:架构实践与踩坑记录
c#
zlinear数据采集卡4 小时前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
阿部多瑞 ABU5 小时前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
条形码D6 小时前
DRG综合管理分析系统-目前已经支持CHS-DRG3.0
c#·drg·3.0分组器·drg分组器·chs-drg3.0分组器
Alex Gram1 天前
数据库同步工具PanguSync图文教程
java·mysql·postgresql·sqlserver·c#·数据库同步软件·数据库同步工具
头茬韭菜1 天前
第 10 篇:「Fluss 实战案例集」—— 完整解决方案与最佳实践
c#·linq·fluss
淡海水1 天前
01-05-运行时-JIT优化全景-内联去虚拟化边界检查消除
windows·c#·虚拟化·jit·内联·边界检查消除
波波0072 天前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
wujian83112 天前
怎么用千问生成word文档:从「格式崩」到「一键过」,AI导出鸭打通最后半厘米
人工智能·ai·c#·word·豆包·deepseek·ai导出鸭