我没有看到您在 Bitmap 中填写的任何内容。
这应该适用于您所有的Panels,无论他们在哪个TabPage:
foreach (Panel px in new Panel[] { p1, p2, p3, p4 } )
using (Bitmap bmp = new Bitmap(pX.ClientSize.Width, pX.ClientSize.Height))
{
pX.DrawToBitmap(bmp, pX.ClientRectangle);
bmp.Save(somefolder + pX.Name + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
事实上,如果Panels 实际上 不可见 而不仅仅是隐藏的TabPages 之一,它甚至会起作用!
当然,您必须确保Panels 具有唯一且符合文件名的Names..
更新:现在我知道Controls 在里面有Panel 而不仅仅是你绘制的图形,也许还有BackgroundImage,我可以理解你遇到的问题..
不幸的是,TabPages 隐藏嵌入式控件的方式令人讨厌。
所以我写了一个小辅助例程,它只会导致主窗体不活动并返回......:
void SaveHiddencontrol(Control ctl, string fileName)
{
Control originalParent = ctl.Parent;
Form fff = new Form();
fff.Opacity = 0;
ctl.Parent = fff;
fff.Show();
System.Drawing.Imaging.ImageFormat fmt = System.Drawing.Imaging.ImageFormat.Jpeg;
if (fileName.ToLower().EndsWith(".png")) fmt = System.Drawing.Imaging.ImageFormat.Png;
using (Bitmap bmp = new Bitmap(ctl.ClientSize.Width, ctl.ClientSize.Height))
{
ctl.DrawToBitmap(bmp, ctl.ClientRectangle);
bmp.Save(fileName, fmt);
}
ctl.Parent = originalParent;
fff.Close();
}
结果如下:
注意Form 本身是如何完全透明,但让Panel 做它的DrawToBitmap 就好了,包括一个图像、一个椭圆和两个控件,甚至独立 的Form.Size ..!
Update2 这是一个完全不闪烁的函数,至少在面板确实不可见的情况下:
void SaveHiddencontrol(Control ctl, string fileName)
{
Control originalParent = ctl.Parent;
int oldLeft = ctl.Left;
ctl.Left = 22222; // way outside
ctl.Parent = this;
System.Drawing.Imaging.ImageFormat fmt = System.Drawing.Imaging.ImageFormat.Jpeg;
if (fileName.ToLower().EndsWith(".png")) fmt = System.Drawing.Imaging.ImageFormat.Png;
using (Bitmap bmp = new Bitmap(ctl.ClientSize.Width, ctl.ClientSize.Height))
{
ctl.DrawToBitmap(bmp, ctl.ClientRectangle);
bmp.Save(fileName, fmt);
}
ctl.Parent = originalParent;
ctl.Left = oldLeft;
}
这只是将Panel 移动到主Form 但way to the right 上,因此它不会显示。然后保存并将其移回。当然,您应该检查Panel 是否确实在隐藏的TabPage 上,否则它会闪烁;在那种情况下,原来的例程就可以了..