Ответы с форумов MSDN

Получить изображение с полным содержимым панели в Windows Forms

Date: 29.07.2018 19:32:26

"Модератор молодец ляпнул не разобравшись в сути вопроса теперь на него никто не обратит внимания"

Не в том дело. На форуме активность и так околонулевая, а сейчас еще и лето, отпуска. 

"Проблема: удается сделать снимок только видимой области контрола 
А нужна картинка всего содержимого для создания общей миниатюры"

Могу предложить такое решение. Перед тем, как делать скриншот, временно увеличьте размеры панели, так чтобы все элементы попали в "кадр" (если панель прокручивается, позицию прокрутки нужно также сбросить в начало). После создания скриншота, верните все назад. Как-то так:

            //сохраняем текущее положение полос прокрутки
            int scrollx = -panel1.AutoScrollPosition.X;
            int scrolly = -panel1.AutoScrollPosition.Y;

            Size szCurrent = panel1.Size; //сохраняем текущий размер панели
            int xmax = panel1.Size.Width, ymax = panel1.Size.Height;
            
            //сбрасываем полосы прокрутки в начало
            panel1.AutoScrollPosition = new Point(0, 0);           

            try
            {

                //найдем крайние координаты для элементов на панели
                foreach (Control c in panel1.Controls)
                {
                    if (c.Right > xmax) xmax = c.Right;
                    if (c.Bottom > ymax) ymax = c.Bottom;
                }

                //добавим запас на полосы прокрутки
                xmax += SystemInformation.VerticalScrollBarWidth;
                ymax += SystemInformation.HorizontalScrollBarHeight;

                //временно увеличим размеры панели, так чтобы все элементы на ней уместились
                panel1.Size = new System.Drawing.Size(xmax, ymax);                

                //создадим полный скришот панели 
                Bitmap memoryImage;
                Rectangle rect = new Rectangle();
                rect.Height = ymax;
                rect.Width = xmax;
                rect.X = 0;
                rect.Y = 0;
                memoryImage = new Bitmap(xmax, ymax);
                panel1.DrawToBitmap(memoryImage, rect);
                pictureBox1.Image = memoryImage;
            }
            finally
            {
                //возвращаем старый размер
                panel1.Size = szCurrent;

                //возвращаем старые позиции прокрутки
                panel1.AutoScrollPosition = new Point(scrollx, scrolly);                
                
            }


Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub