Существует ли предпочтительный, быстрый метод прокрутки в пользовательском элементе управления в GDI +?
Я создал управление, которое графически представляет горизонтально график данных с возможностью прокрутки.
В настоящее время мое управление работает путем преобразования положения горизонтальной полосы прокрутки в смещение в данные. Управление затем представляет данные, которые существуют между этой начальной точкой и конечной точкой, вычисленной на основе ширины управления.
Этот метод работает, но является очень медленным. Я не хочу должным быть вручную перерисовывать всю поверхность управления на каждое событие прокрутки. Скорее я хотел бы инициализировать управление путем рисования полноты (или некоторая часть) графических данных на внеэкранную поверхность и затем фактически прокрутить поверхность управления, заставляя это считать предварительно представленные графические данные, запускающиеся при смещении, вычисленном положением горизонтальной полосы прокрутки.
Действительно ли BitBlt является единственным способом сделать это? Я должен действительно вручную скопировать графические данные от одной поверхности до другого? Я не могу только принять событие Paint и заставить его считывать данные с внеэкранной поверхности, поскольку оно представляет? Таким образом, копия и действие рендеринга один в том же.
Или, я должен сделать что-то неаппетитная еда как краска непосредственно к управлению Панелью и затем просто буквально прокрутить саму панель слева направо?
РАЗЪЯСНЕНИЕ: По существу я хочу знать корректный способ прокрутить предварительно представленный данными. Как каждый прокручивает графические данные в рамках управления? Перерисовка предварительно представленной диаграммы НЕ является корректной опцией.
Да, я бы попробовал двойную буферизацию. Если вы выполняете рендеринг в растровое изображение за пределами экрана, вы можете просто прокручивать его.
Вы можете попробовать визуализировать весь график в одно большое растровое изображение и позволить полосам прокрутки перемещать его. Однако, если ваш график очень большой, вам нужно ограничить размер растрового изображения видимой областью, нарисовать только то, что ему видно, и обработать прокрутку виртуально, как сейчас.
При тестировании на 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