Member 11450536 Ответов: 1

Мерцание, несмотря на методы борьбы с мерцанием


Привет,

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

Он состоит из 3 элементов:
* valueCircle, овальная форма, в которой для представления значения рисуется круг, вызывающий мерцание
* поворотная ручка
• насечка

[просмотр изображений]

Я попытался создать класс, наследующий от OvalShape, переопределил onPaint, изменил все соответствующие свойства в pe.Графика до высокого качества, а затем вызвал MyBase. onPaint(pe), используя новые настройки высокого качества (другими словами, следовал каждому учебнику там для удаления мерцания) безрезультатно.

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

Любая помощь будет оценена по достоинству.

Спасибо,

Рикс

Что я уже пробовал:

Все учебники там по двойной буферизации

Member 11450536

Есть ли причина для голосования одной звездой?

1 Ответов

Рейтинг:
0

Ralf Meier

Я предлагаю следующее, чтобы решить эту проблему :
- ваше управление ручкой должно происходить от управления-оно не должно быть пользовательским управлением.
- Не используйте дополнительные элементы управления - нарисуйте их сами.
- внутри этого вашего переопределения OnPaint-метода и сделать все необходимое рисование самостоятельно. Таким образом, вам нужно только аннулировать один элемент управления вместо 3
- возможная оптимизация может быть такой: вы рисуете свою ручку и шкалу (если она у вас есть) в изображение (один раз в начале - после создания ручки или после изменения размера элемента управления). Если вы теперь измените значение ручки (расположение точки На ней), то сначала нарисуете сохраненное изображение, а затем точку на ее новом месте.

Каждый из этих шагов сделает перекраску вашего элемента управления намного быстрее (и уменьшит мерцание).


Member 11450536

Я забыл упомянуть, как я приближался к нему;

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

Поворотная ручка и выемка имеют овальную и прямоугольную формы. Я ничего не делаю недействительным, я создаю новое растровое изображение, рисую пирог с помощью графики.FromImage (bmp) и установите backgroundImage valueCircle в bmp.

Ralf Meier

Хорошо ... тогда я правильно понял ваш подход.
Чтобы объяснить то, что я написал :
Каждый раз, когда что-то из элемента управления перекрашивается, элемент управления аннулирует себя. Invalidate вызывает OnPaint-метод элемента управления.
Ваше мерцание происходит потому, что вы сначала (я полагаю) рисуете свой пирог.
Теперь вы перерисовываете свой круг (поверх пирога) и, наконец, рисуете прямоугольник в новом положении.
Прав ли я до сих пор ?

Что бы я изменил, так это :
Сначала я создаю график (изображение), который представляет постоянную часть вашего контроля - это означает пустой круг значений и ручку без выемки на ней.
Пока вы не изменили размер своего элемента управления,вам не нужно пересчитывать это изображение.
Если вы измените значение ручки (с помощью свойства или с помощью действия мыши), вы сделаете недействительным свой элемент управления (то, что вызывает метод OnPaint этого элемента управления).
Теперь вы рисуете свой образ.
Затем нарисуйте пирог, но не полный - только как необходимый сегмент и при потере нарисуйте выемку в нужном положении.

Единственный способ предотвратить мерцание - это максимально уменьшить перекраску ...

Извиняюсь... Я не знаю лучшего способа ...