从隐藏面板中保存 Image/Bitmap

Save an Image/Bitmap from hidden panels

我有一个包含四个选项卡的 TabControl,每个选项卡都包含一个面板。 我想一键保存所有面板,但我只能保存前面的面板

有人知道其他方法吗?

Bitmap eins = new Bitmap(p1.Width, p1.Height);
eins.Save(".string."+1+".jpg",System.Drawing.Imaging.ImageFormat.Jpeg);

我没看到你在 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 实际上 不可见 而不仅仅是隐藏 中的一个 =17=] !

当然,您必须确保 Panels 具有唯一且文件名符合 Names..

更新:现在我知道你有 Controls inside Panel 而不仅仅是图形你画画,也许 BackgroundImage,我能理解你遇到的问题..

不幸的是 TabPages 隐藏嵌入式控件的方式很糟糕。

所以我写了一个小助手例程,它不会导致主窗体不活动并返回的闪烁..:[=​​34=]

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.Sizeindependent ..!

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 移动到主 Formway to the right,因此它不会显示。然后保存并将其移回。当然你应该检查 Panel 是否确实在隐藏的 TabPage 上,否则它会闪烁;在那种情况下,原来的例程就可以了..