DrawToBitmap не снимает скриншоты всех предметов

В настоящее время у меня есть этот полезный код, который я нашел в другом месте в StackOverflow:

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

У меня есть форма с несколькими текстовыми полями/выпадающими списками и большим ящиком. Затем у меня есть меньшие коробки с картинками, расположенные поверх этого большого окна.

Когда я просматриваю снимок экрана, он показывает форму, но по каким-то причинам по каким-либо причинам не отображаются меньшие окна с картинками, которые были помещены над большим изображением.

Ответ 1

Я вижу это ограничение в документах для Control.DrawToBitmap():

Элементы управления внутри контейнеров отображаются в обратном порядке.

Это означало бы, что если два элемента управления накладываются друг на друга, тот, который обычно отображается "под" другой (он сначала нарисован, а затем перегружен перекрывающимся элементом управления) вместо этого будет отображаться последним (так что он будет перекрывать тот, который обычно перекрывается Это). В вашем случае, когда меньший элемент управления полностью вычерчивается внутри границ более крупного и поверх него, элемент управления будет скрыт при этом обратном рендеринге.

Попробуйте обходиться с помощью BringToFront() и SendToBack() на более крупном PictureBox, который перекрывается меньшими. Вызовите BringToFront() непосредственно перед рисованием в растровое изображение, а затем SendToBack(), когда закончите. Если вы не хотите, чтобы пользователь видел мерцание экрана, попробуйте вызвать функцию SuspendLayout() перед внесением изменений в Z-порядок, а затем ResumeLayout (true) после сброса до нужного Z-порядка.

Ответ 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);
        }

    }