Как можно прокрутить законно с GDI +?

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

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

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

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

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

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

РАЗЪЯСНЕНИЕ: По существу я хочу знать корректный способ прокрутить предварительно представленный данными. Как каждый прокручивает графические данные в рамках управления? Перерисовка предварительно представленной диаграммы НЕ является корректной опцией.

5
задан James 10 March 2010 в 02:16
поделиться

1 ответ

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

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

При тестировании на 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
3
ответ дан 15 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: