Рисование в пользовательском элементе управления и механизм аннулирования - PullRequest
0 голосов
/ 27 июля 2011

Пользовательский элемент управления, который я создаю, должен нарисовать много «элементов» в его клиентском пространстве.Вызов Invalidate () вызовет новый цикл рисования, при котором все элементы будут перерисованы.

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

Сложность состоит в том, что при выполнении OnPaint трудно определить, были ли выполнены другие вызовы Invalidate ().в это время.В этом случае это должно сделать "нормальную", полную краску.

Я использую прямоугольник клипа.Конечно, я мог проверить, стал ли прямоугольник клипа в OnPaint целым клиентским прямоугольником, признаком того, что был вызван Invalidate (), но это не на 100% безопасно.Я думал о других подобных решениях, но они кажутся хакерскими.

Как обычно или лучше всего решается эта проблема?

1 Ответ

0 голосов
/ 19 августа 2011

Решением здесь было бы использование подхода двойной буферизации с классом BufferedGraphics.Таким образом, в OnPaint не будет так много сложностей, и вы сможете рисовать когда угодно и что угодно.

MSDN: графика с двойной буферизацией (в разделе «Ручное управление»).Буферизованная графика ")

Вот полезный пример: Пользовательские элементы управления рисованием в C # - Ручная двойная буферизация

...