Как избежать мерцания экрана, когда элемент управления должен постоянно перекрашиваться в C #? - PullRequest
3 голосов
/ 09 октября 2008

У меня есть простая панель, которая используется в качестве поверхности для рисования. Цель здесь - при определенных обстоятельствах нарисовать контур шириной 4 пикселя вокруг дочернего ListView. Я хотел бы, чтобы контур пульсировал, когда в него можно что-то затянуть.

Я просто рисую простой прямоугольник вокруг ListView и обновляю непрозрачность прямоугольника внутри события отметки времени. Когда непрозрачность изменяется, граница перерисовывается. На данный момент я делаю двойную буферизацию картины. Я также разрешаю перерисовку каждые 15 тиков или около того (интервал таймера составляет 20 мс). После всего этого процесс рисования все еще немного мерцает. Это неприемлемо, поэтому мне нужно несколько советов о том, как мне этого избежать.

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

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

Ответы [ 6 ]

4 голосов
/ 09 октября 2008

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

SetStyle(ControlStyles.SupportsTransparentBackColor |
         ControlStyles.Opaque |
         ControlStyles.UserPaint |
         ControlStyles.AllPaintingInWmPaint, true);

Затем я сначала закрашиваю область прозрачным цветом, а затем закрашиваю границы. Я немного взломал, но это работает как шарм.

РЕДАКТИРОВАТЬ: И не забудьте удвоить буфер изображения.

3 голосов
/ 09 октября 2008

Установить DoubleBuffered = true в форме.

1 голос
/ 09 октября 2008

Я заранее сожалею, что это, вероятно, не поможет, но: WPF имеет анимацию и, по крайней мере, теоретически может сделать это плавно.

1 голос
/ 09 октября 2008

У меня нет сильного ответа, но так как у вас его нет, я все равно выложу:

Во-первых, я никогда не использовал класс System.Drawing.ImageAnimator, но может ли это быть лучшим подходом для вас?

Во-вторых, если это не удастся, вы пробовали не с использованием двойной буферизации? Это длинный выстрел, но, возможно, ваш код двойной буферизации на самом деле ухудшает ситуацию.

0 голосов
/ 09 октября 2008

Вы также можете захотеть посмотреть на рисование на растровом изображении, а затем просто отобразить растровое изображение, если оно изменилось. Просто мой 2с.

0 голосов
/ 09 октября 2008

Длинный выстрел, но вы пробовали

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

На панели управления?

...