【问题标题】:DrawToBitmap not taking screenshots of all itemsDrawToBitmap 没有截取所有项目的屏幕截图
【发布时间】:2012-04-10 20:44:34
【问题描述】:

我目前拥有在 StackOverflow 其他地方找到的有用代码:

form.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));

我有一个带有几个文本框/下拉菜单和一个大图片框的表单。然后我将较小的图片框放在这个大图片框的顶部。

当我查看截取的屏幕截图时,它显示了表单,但是由于某种原因,放置在大图片框上方的较小图片框没有显示?

【问题讨论】:

  • 你能把整个代码贴出来,因为我们无法确定问题出在哪里。

标签: c# winforms image drawtobitmap


【解决方案1】:

我在 Control.DrawToBitmap() 的文档中看到了这个限制:

容器内的控件以相反的顺序呈现。

这意味着如果两个控件相互重叠,则通常呈现在另一个“下方”的一个(它首先绘制,然后被重叠的控件覆盖)将改为最后呈现(因此它将与通常重叠的那个重叠它)。在您的情况下,如果较小的控件完全绘制在较大控件的边界内并在其顶部,则该控件将被此反向渲染隐藏。

尝试通过在被较小图片框重叠的较大图片框上使用 BringToFront() 和 SendToBack() 来解决此问题。在绘制位图之前调用 BringToFront(),完成后调用 SendToBack()。如果您不希望用户看到屏幕闪烁,请尝试在进行任何 Z 顺序更改之前调用 SuspendLayout(),然后在重置为正确的 Z 顺序后调用 ResumeLayout(true)。

【讨论】:

  • 非常感谢基思的回复。这非常有效。正如你所说,我只是在大图片框上调用了 BringToFront(),截取了屏幕截图,然后调用了 SendToBack()。
【解决方案2】:

感谢 KeithS 帮助我!

对于那些需要代码来执行这些反向和反向操作的人,请看这里:

    private void ReverseControlZIndex(Control parentControl)
    {
        var list = new List<Control>();
        foreach (Control i in parentControl.Controls)
        {
            list.Add(i);
        }
        var total = list.Count;
        for (int i = 0; i < total / 2; i++)
        {
            var left = parentControl.Controls.GetChildIndex( list[i]);
            var right = parentControl.Controls.GetChildIndex(list[total - 1 - i]);

            parentControl.Controls.SetChildIndex(list[i], right);
            parentControl.Controls.SetChildIndex(list[total - 1 - i], left);
        }                        
    }

    private void SaveImage()
    {
        SaveFileDialog sf = new SaveFileDialog();
        sf.Filter = "Bitmap Image (.bmp)|*.bmp|Gif Image (.gif)|*.gif|JPEG Image (.jpeg)|*.jpeg|Png Image (.png)|*.png|Tiff Image (.tiff)|*.tiff|Wmf Image (.wmf)|*.wmf";
        if (sf.ShowDialog() == DialogResult.OK)
        {
            int width = pnlCanvas.Size.Width;
            int height = pnlCanvas.Size.Height;

            Bitmap bm = new Bitmap(width, height);


            SuspendLayout();
            // reverse control z-index
            ReverseControlZIndex(pnlCanvas);

            pnlCanvas.DrawToBitmap(bm, new Rectangle(0, 0, width, height));

            // reverse control z-index back
            ReverseControlZIndex(pnlCanvas);
            ResumeLayout(true);

            bm.Save(sf.FileName, ImageFormat.Bmp);
        }

    }

【讨论】:

    猜你喜欢
    • 2019-03-19
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2012-11-27
    相关资源
    最近更新 更多