C# 内存Form截图问题

geniusatm4 2010-03-05 01:50:15
目前按照要求自己创建了个Form,但是不Show,只放在内存里,请问怎么样截图?

我用DrawToBitmap画不出Form其中的控件,最好高手能给个sample,谢谢
...全文
443 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiongqiang1975 2011-01-19
  • 打赏
  • 举报
回复
我也试试这个方法怎么样?
dengguoqing 2010-11-24
  • 打赏
  • 举报
回复
按照楼上的做法,获得Form的截图,可是获得Form中的DataGridView控件的截图,后台往控件中添加了若干数据,有些问题的是,
scrollbar在图像的中间显示出来,设置scrollbar为none,也不起作用。
请指点
jiangming4333 2010-05-30
  • 打赏
  • 举报
回复
学习了!!!
狂想者 2010-03-05
  • 打赏
  • 举报
回复
学习一下,都 是高手啊!!
calltaotao 2010-03-05
  • 打赏
  • 举报
回复
试着用UserControl代替Form作为容器
    internal class UserControl:Control
{
public UserControl()
{

System.Windows.Forms.Label label1;
label1=new Label();
label1.AutoSize = true;
label1.Location = new System.Drawing.Point(22, 22);
label1.Name = "label1";
label1.Size = new System.Drawing.Size(65, 12);
label1.TabIndex = 0;
label1.Text = "我是猪头哦";

this.ClientSize = new System.Drawing.Size(300, 300);
this.Controls.Add(label1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
this.PerformLayout();
}
}


然后
            var bitmap = new Bitmap(300, 300);
var userControl = new UserControl();
userControl.DrawToBitmap(bitmap, new Rectangle(0, 0, 300, 300));
bitmap.Save("d:\\temp.bmp", ImageFormat.Bmp);
xingyuebuyu 2010-03-05
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

Form2 frm2;
Bitmap bmp;

//i,j分别是标题和边框导致的控件Location的偏移
int i;
int j;
private void Form1_Load(object sender, EventArgs e)
{

frm2 = new Form2();
bmp =new Bitmap(frm2.Width, frm2.Height);
i = frm2.Width - frm2.ClientSize.Width;
j = frm2.Height - frm2.ClientSize.Height;
frm2.DrawToBitmap(bmp, new Rectangle(0, 0, frm2.Width, frm2.Height));
Draw(frm2,frm2);

bmp.Save("e:\\123.bmp");
bmp.Dispose();
}

void Draw(Control ctrl,Form frm)
{
foreach (Control c in ctrl.Controls)
{
if (ctrl.Parent != frm)
{
c.DrawToBitmap(bmp, new Rectangle(c.Location.X + i, c.Location.Y + j, c.Width, c.Height));
}
else
{
c.DrawToBitmap(bmp, new Rectangle(c.Location.X+ctrl.Location.X+i , c.Location.Y+ctrl.Location.Y +j, c.Width, c.Height));

}
Draw(c,frm);
}

}

}
}


测试通过,在Form2上有button,panle,panle里也有button;
其实就是将窗体上的所有控件都画一次就可以了
calltaotao 2010-03-05
  • 打赏
  • 举报
回复
猜测:用C# new 出一个窗体的实例时调用了Windows API CteateWindow或CteateWindowEx 此时默认清除了WS_VISIBLE标志,而调用Show()方法时,则调用带SW_SHOW标志的Windows API ShowWindow.

方案:试试在new 出Form实例对象后,调用Windows API SendMessage 像该Form实例发送 WM_PAINT消息.
88csdn 2010-03-05
  • 打赏
  • 举报
回复
呵呵,不能搞定的,Show的时候才会绘制吧
你可以设置一下Location,Show到屏幕外嘛,这样就不闪啊
geniusatm4 2010-03-05
  • 打赏
  • 举报
回复
还没搞定。。。。。。。
geniusatm4 2010-03-05
  • 打赏
  • 举报
回复
谢谢楼上的回答。。。可是这样毕竟会弹出窗口,现在要求只能在后台描画。。
diegoyu 2010-03-05
  • 打赏
  • 举报
回复
建议LZ保存窗口后马上关闭窗口,不知这效果如何
geniusatm4 2010-03-05
  • 打赏
  • 举报
回复
顶下~~~~~~~~~~~~
geniusatm4 2010-03-05
  • 打赏
  • 举报
回复
如果代码[code=C#] AForm f = new AForm(property);
Bitmap bm = new Bitmap(1024, 768);
f.Show();
f.DrawToBitmap(bm, new Rectangle(0, 0, 1024, 768));
bm.Save(@"d:\\test.png");code]
这样就正常了,但是我不能让他show出来。。
geniusatm4 2010-03-05
  • 打赏
  • 举报
回复
谢谢回答,因为我只是想模拟一个窗口,然后保存这个图片,有什么办法让他画在内存dc(Graphics)上吗?
            AForm f = new AForm(property);
Bitmap bm = new Bitmap(1024, 768);
f.DrawToBitmap(bm, new Rectangle(0, 0, 1024, 768));
bm.Save(@"d:\\test.png");


这样保存下来的图片只有一个Form,上面的控件全没画出来
titth 2010-03-05
  • 打赏
  • 举报
回复
没看明白什么意思,都不SHOW,还怎么截图?
zkwangbb 2010-03-05
  • 打赏
  • 举报
回复
不明白想实现什么的功能,新建一个FORM为什么不SHOW呢?


geniusatm4 2010-03-05
  • 打赏
  • 举报
回复
没人知道吗?BitBlt能搞定嘛?

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧