CopyFromScreen返回Form后面的图像

时间:2013-09-04 08:57:35

标签: c# windows winforms

我这里有一个严重的问题。 Iam编程工具,用户可以在其中为开关设备设计控制柜。小隔间是用Panels和Pictureboxes绘制的,它工作得很好,看起来不错。

现在我想制作一个导出功能,将设计好的Cubicle导出为pdf文件。

到目前为止一切顺利,功能正常 - 只在我的电脑上! 我使用CopyFromScreen获取显示小隔间的Panel的屏幕截图,将其保存到文件中并将其放入pdf文件中(我还试图使用DrawToBitmap获取面板的图片,但这不能正常工作,因为它正在绘制一些Pictureboxes而不是其他人。在我的计算机上,它正确捕获面板并在pdf中显示正确的图片,但是在每台其他计算机上,它都会显示表单背后的内容。这是非常令人困惑的,因为我不知道为什么它应该这样做以及它为什么在我的系统上工作。到目前为止,我尝试了一些东西来迫使窗口位于顶部,但没有任何东西可以工作,每个人都可以获得桌面或后面窗口的图片。

代码:

void takeScreenshot()
    {
        this.TopMost = true;
        this.BringToFront();
        this.Focus();
        Application.DoEvents();

        System.Drawing.Rectangle bounds = Mainpanel.Bounds;
        bounds.Width = bounds.Width - 6;
        bounds.Height = bounds.Height - 4;
        using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
        {
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                g.CopyFromScreen(Mainpanel.PointToScreen(new Point()).X + 3, Mainpanel.PointToScreen(new Point()).Y + 2, 0, 0, bounds.Size);
            }
            bitmap.Save(Application.StartupPath + "\\data\\programdata\\temppic.bmp");
        }
        this.TopMost = false;
    }
实际上我非常绝望,没有导出程序就没用了。

有没有人知道如何解决这个问题?

乔纳森

1 个答案:

答案 0 :(得分:0)

使用此代码。

void takeScreenshot()
    {
        Application.DoEvents();
        System.Drawing.Rectangle bounds = Mainpanel.Bounds;
        bounds.Width = bounds.Width - 6;
        bounds.Height = bounds.Height - 4;

        using (Bitmap bitmap = new Bitmap(Mainpanel.Width, Mainpanel.Height))
        {
            Mainpanel.DrawToBitmap(bitmap, new Rectangle(3, 2, bounds.Width, bounds.Height));
            bitmap.Save(Application.StartupPath + "\\data\\programdata\\temppic.bmp");
        }
    }