Скиншот контрола panel

182
21 сентября 2018, 14:10

Цель: сделать снимок контрола в частности панели(Mainpanel) Проблема: удается сделать снимок только видимой области контрола А нужна картинка всего содержимого для создания общей миниатюры

Использую следующий код

Bitmap memoryImage;
Rectangle rect = new Rectangle();
rect.Height = Mainpanel.Height;
rect.Width = Mainpanel.Width;
rect.X = 0;
rect.Y = 0;
memoryImage = new Bitmap(Mainpanel.Width, Mainpanel.Height);
Mainpanel.DrawToBitmap(memoryImage, rect);
pictureBoxMiniature.Image = memoryImage; 
Answer 1

Можно временно увеличить размеры панели, так чтобы она захватывала все элементы, а после создания скриншота вернуть назад:

//сохраняем текущее положение полос прокрутки
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);                
}
READ ALSO
Обрезать строку в гриде - не помещается

Обрезать строку в гриде - не помещается

Я пытаюсь заполнить мой DGV из БД, но одна из колонок содержит слишком длинную строку и поэтому ячейки остаются пустымиЯ бы хотела просто обрезать...

181
C# WPF MVVM биндинг из другого окна

C# WPF MVVM биндинг из другого окна

Открываю второе окно в котором есть TextBox, ставлю ему DataContextКак мне получить значение из TextBox'a после закрытия окна?

234
Получить список Queue и Exchanges в RabbitMQ

Получить список Queue и Exchanges в RabbitMQ

Можно ли получить как-то список существующих очередей? Хочу в дальнейшем использовать их в c#

193
C# WPF MVVM обновление view datagrid

C# WPF MVVM обновление view datagrid

У меня datagrid забинден sourceitems к ObservableCollection, когда я изменяю что-нибудь из коллекции, коллекция изменяется но view не показывает пока не кликну...

226