Winform 中控件图像导出

在Winform中,要将一个控件的显示内容导出为bitmap图像,可以通过如下两种方式:

1. 利用控件本身的DrawToBitmap方法

UserControl chartContainPanel = new UserControl();
Bitmap map = new Bitmap(chartContainPanel.Width, chartContainPanel.Height);
chartContainPanel.DrawToBitmap(map, chartContainPanel.ClientRectangle);
map.Save(fileName);

注意的是,DrawToBitmap是将控件的显示内容进行重绘,如果控件本身显示的内容并不是通过Paint事件加载的,而是通过其他方式绘制上去,通过该方法得到的内容将是空白的

2. 利用Graphics的截图功能CopyFromScreen

UserControl chartContainPanel = new UserControl();
Graphics graph = chartContainPanel.CreateGraphics();
Size s = chartContainPanel.Size;
Bitmap memoryImage = new Bitmap(s.Width, s.Height, graph);
Graphics memoryGraphics = Graphics.FromImage(memoryImage);
Point screen = chartContainPanel.PointToScreen(this.Location);
memoryGraphics.CopyFromScreen(screen.X, screen.Y, 0, 0, s);
memoryImage.Save(fileName);

该方式是直接对屏幕进行截图操作

时间: 2024-08-28 06:35:46

Winform 中控件图像导出的相关文章

C#中使用多线程访问Winform中控件的若干问题

我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(Thread

关于Winform中控件的跨线程访问

闲着没事想起来用winform做一个随机的抽号程序,咋看来这么个东西其实并不难,不过对于一个菜鸟来说其实并不简单!尤其是对于多线程不是特别熟悉的新手来说. 首先,界面比较简单winform,(图片上传好麻烦~~!) 既然是随机抽取号码,就得有随机数(其实关键不在这里,图省事就random了) 可是在用到多线程的时候问题就出现了: 无法跨线程访问label控件,无法修改label的text. 网上找了很多资料,感觉例子搞得难以理解,遂自己撸起.... 1.有人这么写: // Control.Che

Winform中控件,鼠标坐标位置计算

Winform中获得鼠标位置的 (是鼠标到屏幕左上角的位置): pt = Cursor.Position; 获得控件距屏幕位置(是控件到屏幕左上角位置) PointToScreen(this.drawingPanel.Location 获得控件距离Form窗体位置: this.drawingPanel.Location 这里需注意鼠标的位置是到屏幕左上角距离,而不是到Form窗体的距离,这里取部分代码截图 //滑动前鼠标距离Panel左上角位置距离                 SizeF s

winform控件大全

目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox(文本框)控件 4.RichTextBox控件 5.NumericUpDown控件 6.Button(按钮)控件 7.GroupBox(分组框)控件 8.RadioButton(单选按钮)控件 9.CheckBox(复选框)控件 10.ListBox(列表框)控件 11.ComboBox(组合框)控件 12.CheckedListBox(复选列表框)控件 13.PictureBox(图片框)控件 14.Timer(定时器

.Net WinForm 控件键盘消息处理剖析

在WinForm控件上我们可以看到很多关于键盘消息处理的方法,比如OnKeyDown, OnKeyPress, ProcessCmdKey, ProcessDialogKey,IsInputKey等等,那么这些方法是如何被组织的,每一个方法的具体含义又是什么哪?Win32的键盘消息又是如何到达控件上的这些方法的,本文将着重阐述这些问题,对.Net WinForm控件的键盘消息处理过程进行剖析.  1.      WinForm消息循环 大家都知道WinForm也是依赖于底层的消息机制的,通常我们

通过WinForm控件创建的WPF控件无法输入的问题

今天把写的一个WPF程序发布到别的机器上执行,发现一个比较奇怪的问题:在那个机器上用英文输入法无法输入数字,非要切换到中文输入法才行:但在我的机器上却是好好的. 最开始以为是输入法的问题,弄了好一阵子后,终于找到了原因:虽然这个程序是个WPF程序,但为了复用之前的部分代码,使用着一个WinForm的菜单控件,后续的子窗口都是通过这个WinForm菜单创建的.而用WinForm控件创建的WPF控件可能出现无法正确响应键盘事件的情况. 找到了原因后,一个常规的解决方法是:将WinForm控件换成WP

Android中控件的宽高

1.在一个Relatitivelayout布局里用代码add一个独立的button布局,结果该button的宽高无效 则说明:Android中控件默认是没有宽高的,只有五大布局才能给其宽高,即在代码中要设置控件的宽高需要使用福控件的layoutparams 命名规则:layout_width 想通的:layout_gravity和gravity 2.直接在activity中setContentView里引用最外层为button的布局,则也有宽高 原因:android默认在最外层给添加了Frame

问题解决——MFC SDI程序 CFormView中控件随窗口缩放

从来都是做对话框程序,这次想做个SDI的程序,想着用一下带Robbin界面的office2007风格,就不用使用那些花钱的商业控件/UI库了. 如果你不想看我打的文字,可以直接拷走代码,自己声明上定义再略作修改就可以用了,不需做任何修改. -------------------------------小尾巴首次登场----------------------------------- SDI程序,是要缩放的,如果是往里输入文字的话,这倒没什么,但是这次我使用的是CFormView类,里面加了控件

C#中WinForm控件的跨线程更新Invoke

目的: 用WinForm(C#)搭建一个用户界面,一个进度条和一个按钮,按钮启动进度条,进度完成时停止更新 示例: 实现: 在按钮事件中设置循环,更新进度条         private void btnProgress_Click(object sender, EventArgs e)         {             for (int ii = 0; ii < 100; ii++)             {                 progressBar1.Value