Как устранить мерцание в Windows.Формирует пользовательский элемент управления при прокрутке?
Вопрос
Я хочу создать пользовательский элемент управления на C #.Но каждый раз, когда мне приходится полностью перерисовывать свой элемент управления, он мерцает, даже если я использую двойную буферизацию (сначала рисую изображение, а затем закрываю его).
Как мне устранить мерцание, когда мне приходится полностью перерисовывать?
Решение
Вы могли бы попробовать поместить следующее в свой конструктор после вызова InitiliseComponent.
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);
Редактировать:
Если вы решитесь на это, если сможете, удалите свой собственный код двойной буферизации и просто попросите элемент управления отрисовывать себя в ответ на вызов соответствующих виртуальных методов.
Другие советы
Я извлек это из рабочей программы на C #.Другие плакаты содержат синтаксические ошибки и явно скопированы с C ++ вместо C#
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);
Возможно, будет достаточно просто позвонить
SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true);
Мерцание, которое вы видите, скорее всего, потому, что Windows сначала рисует фон элемента управления (через WM_ERASEBKGND), затем запрашивает ваш элемент управления выполнить любой рисунок, который вам нужно сделать (через WM_PAINT).Отключив фоновую раскраску и выполнив всю раскраску в вашем переопределении OnPaint, вы можете устранить проблему в 99% случаев без необходимости использовать всю память, необходимую для двойной буферизации.
Вы говорите, что пробовали двойную буферизацию, но затем говорите, что сначала рисуете Изображение и удаляете его.Вы пробовали устанавливать DoubleBuffered = true в конструкторе, а не делать это самостоятельно с Изображением?