Как получить плавный графический интерфейс без мерцания для приложения, запущенного через удаленный рабочий стол? - PullRequest
3 голосов
/ 09 марта 2010

Я понимаю, что в интернете тонет множество вопросов об уменьшении мерцания в приложениях Windows Forms. После обильных экспериментов я обнаружил, что решение в моем конкретном случае было довольно простым: установив для свойства Control.DoubleBuffered значение true для элементов управления, которые проявляли мерцание. Я достиг этого, просто получив необходимые классы управления (в моем случае от ListView до DoubleBufferedListView и от DataGridView до DoubleBufferedDataGridView).

Основным виновником приложения, над которым я работаю, является DataGridView, который обновляет многие ячейки в событии Tick объекта Windows.Forms.Timer. Перед включением двойной буферизации сетка будет слегка мерцать (не так уж плохо, но достаточно, чтобы быть заметной) в большинстве обновлений. После включения двойной буферизации мерцание исчезло.

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

Тогда мой вопрос: что должен использовать? Чен предлагает переключиться между подходом с двойной буферизацией на локальных машинах и традиционным подходом с двойной буферизацией для подключений к удаленному рабочему столу; но в этом случае конечные пользователи этого приложения все еще будут испытывать мерцание. Это просто неизбежно?

Для справки: это , а не , простой вопрос вызова BeginUpdate / EndUpdate (уже это делается на ListBox и ListView элементах управления) или SuspendLayout / ResumeLayout (это уже делается для элемента управления DataGridView, хотя я не думаю, что это даже особенно важно, поскольку, как я уже сказал, я просто обновляю значения в определенных ячейках).

Может быть, приложение без рабочего стола без мерцания просто невозможно?

1 Ответ

1 голос
/ 09 марта 2010

В категории «Стоит попробовать»: установите флаг AllPaintingInWmPaint на элементе управления или переопределите OnPaintBackground, как предлагается здесь: http://alt.pluralsight.com/wiki/default.aspx/Craig/FlickerFreeControlDrawing.html

Это поможет приблизить фоновую краску к краям переднего плана. Это повысит вероятность того, что они будут отправлены одновременно с клиента на сервер.

...