Как программно реализовать прокрутку фона в PictureBox? - PullRequest
1 голос
/ 02 марта 2020

У меня есть pictureBox в моей программе. Эта pictureBox является своего рода «неограниченной» рабочей областью для других моих элементов управления (ее ширина и высота постоянно росли, когда некоторые из моих элементов управления, расположенных внутри этого pictureBox, приближались к границам pictureBox). Я сам внедряю полосы прокрутки для pictureBox программно, он просто меняет расположение элемента управления внутри pictureBox. Теперь я также хочу реализовать прокручиваемый фон. Я хочу, чтобы положение фона изменилось, а также элементы управления при прокрутке scrollBar. Я создаю код для этого (я упрощаю его для легкого чтения. Вот только logi c для горизонтального scrollBar. Я называю это, когда ScrollBar событие работает):

public Bitmap DrawImageUnscaled(int x, int y, int width, int height)
{
//this is the part of the image that will be cropped
    Bitmap croppedPartBitmpap = new Bitmap(width, height);
    Rectangle croppedPartRectangle = new Rectangle(x, y, width, height);

    using (var g = Graphics.FromImage(croppedPartBitmpap))
    {
//BigBitmap - original background
        g.DrawImage(this.BigBitmap, 0, 0, croppedPartRectangle, GraphicsUnit.Pixel);
    }
//this is the part of the image that will left 
    Bitmap leftPartBitmap = new Bitmap(this.PanelWidth - width, height);
    Rectangle leftPartRectangle = new Rectangle(width, y,this.PanelWidth - width, height);
    using (var g = Graphics.FromImage(leftPartBitmap))
    {
        g.DrawImage(this.BigBitmap, 0, 0, leftPartRectangle, GraphicsUnit.Pixel);
    }

//this is the merged image
    Bitmap mergedBitmap = new Bitmap(this.PanelWidth, this.PanelHeight);
    using (var g = Graphics.FromImage(mergedBitmap))
    {
        g.DrawImage(leftPartBitmap, 0, 0);
        g.DrawImage(croppedPartBitmpap, leftPartBitmap.Width, 0);
    }
    return mergedBitmap;
}

Когда я прокручиваю это pictureBox область, программа обрезает часть фона, которая выходит за границы, и после этого объединяется в конце с частью, оставленной на экране. Это работает хорошо, но это занимает так много памяти, это может занять 2 ГБ и более. Можете ли вы помочь мне избежать использования такого гигантского памяти? Может быть, вся логика c не так, и я должен попробовать лучшее решение для этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...