2010-05-01 3 views
2

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

Дело в том, что рисование линий в DC происходит очень быстро, но рисование непосредственно в растровое изображение происходит очень медленно. Это происходит только быстро, если вы блокируете биты и начинаете настройку пикселей. Могу ли я рисовать несколько экземпляров DC в моем событии WM_PAINT, а затем просто DrawBitmap для каждого уровня в MemDC? Каков наилучший способ сделать это?

Благодаря

ответ

2

GDI +, конечно, достаточно быстро для программы рисования. Я использую его (от C#) для высокоскоростной анимации (> 30 кадров в секунду).

Похоже, что вы хотите иметь возможность управлять отдельными пикселями. Это очень быстро с LockBits, и хотя это немного неуклюже для использования в C# (требуется указатель и тег unsafe), похоже, что это не так сложно в C++.

Возможно, вы не хотите копировать несколько слоев непосредственно на поверхность управления внутри события рисования. Вместо этого этот рендеринг должен выполняться в буфер вне экрана (B1). После того, как B1 будет нарисован при завершении всех операций копирования/рисования, скопируйте его во второй буфер вне экрана (B2), а затем недействите/обновите контрольную поверхность. В событии рисования элемента управления вы копируете с B2 на видимую поверхность.

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

Вы можете отобразить один буфер вне экрана и скопировать его с видимой поверхности в событие рисования. Главным усложнением здесь является то, что вам приходится иметь дело с каким-то образом с «блуждающими» событиями рисования, то есть событиями, которые не вызваны преднамеренной недействительностью элемента управления, а чем-то другим (например, пользователь перетаскивает другое окно поверх вашего). Если вы скопируете из буфера вне экрана на поверхность, и буфер будет только на полпути, вы получите мерцание. Если вы заблокируете событие рисования до завершения рисования буфера, на вашем элементе вы увидите «формы следов», что выглядит еще хуже.

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

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