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)

相关推荐
rockey6274 小时前
AScript如何实现中文脚本引擎
c#·.net·script·eval·expression·function·动态脚本
我是唐青枫6 小时前
C#.NET gRPC 深入解析:Proto 定义、流式调用与服务间通信取舍
开发语言·c#·.net
unicrom_深圳市由你创科技6 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
昵称暂无17 小时前
.NET 高级开发 | i18n 原理、实现一个 i18n 框架
javascript·c#·.net
疯狂成瘾者8 小时前
Chroma向量数据库
开发语言·数据库·c#
我是唐青枫8 小时前
C#.NET Monitor 与 Mutex 深入解析:进程内同步、跨进程互斥与使用边界
开发语言·c#·.net
ou.cs8 小时前
c# 信号量和锁的区别
开发语言·c#
yugi9878388 小时前
C# 串口下载烧写BIN文件工具
开发语言·c#
"菠萝"10 小时前
C#知识学习-021(文字关键字)
开发语言·学习·c#
游乐码10 小时前
c#HashTable
开发语言·c#