Как можно законно прокрутить с GDI +? - PullRequest
5 голосов
/ 17 февраля 2010

Есть ли предпочтительный, быстрый способ прокрутки в пользовательском элементе управления в GDI +?

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

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

Является ли BitBlt единственным способом сделать это?Мне действительно нужно вручную копировать графические данные с одной поверхности на другую?Разве я не могу просто взять событие Paint и заставить его читать данные с экранной поверхности во время рендеринга?Таким образом, действие копирования и рендера - одно и то же.

Или я должен сделать что-то наподобие рисования непосредственно для элемента управления Panel, а затем просто буквально прокрутить саму панель слева направо?

УТОЧНЕНИЕ : По сути, я хочу знать правильный способ прокрутки предварительно отрендеренных данных.Как прокрутить графические данные в элементе управления?Перерисовка предварительно отрисованного НЕПРАВИЛЬНОГО параметра.

1 Ответ

3 голосов
/ 17 февраля 2010

Да, я бы попробовал двойную буферизацию. Если вы визуализируете изображение вне экрана, вы можете просто прокрутить растровое изображение.

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

При тестировании на 32-битной Windows XP я обнаружил, что ограничение составляет около 237,9 миллиона пикселей. Это, безусловно, достаточно для большинства элементов управления, но этого может быть недостаточно для вашего приложения.

Для любопытных, вот максимальные размеры растрового изображения Windows, которые мы смогли создать и использовать:

Width   Height    Area (pixels)
======   ======    ===========
32,767    7,261 237,921,187
25,000    9,517 237,925,000
23,792   10,000 237,920,000
20,000   11,896 237,920,000
15,861   15,000 237,915,000
15,000   15,861 237,915,000
11,896   20,000 237,920,000
10,000   23,792 237,920,000
 9,517   25,000 237,925,000
 7,261   32,767 237,921,187
...