2015-05-13 3 views
2

При прокрутке изображения в браузере с помощью полос прокрутки - изображение прокручивается быстро и плавно. С другой стороны, создавая плотный цикл с Graphics.DrawImage, увеличивая X-координату местоположения на 1 каждую итерацию, возвращается медленное движение. (Это также несколько отрывисто даже после создания управления DoubleBuffered.)Прокрутка изображения быстро и плавно

Как получить быстрый рендеринг, например, в браузере?

EDIT

void DoNow() 
{ 
    Rectangle rec1 = new Rectangle(Point.Empty, panel1.BackgroundImage.Size); 
    Rectangle rec2 = new Rectangle(Point.Empty, panel1.BackgroundImage.Size); 

    using (Graphics g = Graphics.FromImage(panel1.BackgroundImage)) 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      rec2.Location = new Point(rec2.Location.X + 1, rec2.Location.Y); 
      g.DrawImage(image, rec1, rec2, GraphicsUnit.Pixel); 
      panel1.Refresh(); 
     } 
    } 
} 
+3

Не видя своего кода, вы не можете ответить на свой вопрос (который также слишком широк). Довольно просто реализовать быструю прокрутку (даже для огромных изображений), пока она реализована эффективно. Увеличение позиции на 1 пиксель за перемещение полосы прокрутки, вероятно, неверный подход - вам нужно полагаться на отношение видимого и скрытого размера изображения. – xxbbcc

+0

@xxbbcc Код имеет только - 'g.DrawImage (образ, rec1, rec2, GraphicsUnit.Pixel);' и 'panel1.Refresh();'. Без него ничего не обновится. Остальное просто создает «Графика» и цикл. Увеличение на более чем 1 было слишком резким, чтобы даже считаться. – ispiro

+1

«Создание« Графика »... вы сами создаете графический объект? Вы не должны этого делать, он должен быть предоставлен вам через аргументы события «Paint». – Anthony

ответ

0

Кажется, из комментариев, как ответ на мой вопрос в том, что браузеры используют аппаратное ускорение, которое недоступно для Winforms. (Пожалуйста, не стесняйтесь исправить меня, если я ошибаюсь.)

+0

Поскольку комментаторы не отправляли свои ответы в течение нескольких дней, я отменяю свой ответ. – ispiro

0

Самое простое решение - использовать объект Panel с полосами прокрутки, установленными в Auto. Поместите изображение в качестве дочернего объекта с режимом размера, установленным на «Авто». Поле изображения будет расширяться до размера изображения, которое вы ему назначили. Поскольку окно с картинкой будет больше, чем панель, появятся полосы прокрутки панели. Когда вы прокручиваете изображение с помощью панели, оно будет плавным.

Если вы все еще хотите вручную создать чертеж самостоятельно, вы получаете «мерцание», потому что метод Invalidate автоматически выполняет стирание фона, которое не выполняется во время события OnPaint. Вам нужно подклассифицировать родительский элемент управления, на который вы рисуете, и переопределить событие OnPaintBackground. Как показано ниже:

protected override void OnPaintBackground(PaintEventArgs pevent) 
{ 
    // base.OnPaintBackground(pevent); 
} 

Кроме того, не забудьте выполнить ВСЕ рисунок во время события OnPaint и использовать объект e.Graphics.

Смежные вопросы