Как устранить мерцание в Windows. Forms пользовательский элемент управления при прокрутке? - PullRequest
8 голосов
/ 15 сентября 2008

Я хочу создать пользовательский элемент управления в C #. Но каждый раз, когда мне приходится полностью перерисовывать свой элемент управления, он мерцает, даже если я использую двойную буферизацию (сначала рисуем изображение, а затем стираем).

Как устранить мерцание, когда мне нужно полностью перерисовать?

Ответы [ 4 ]

13 голосов
/ 15 сентября 2008

Вы можете попробовать добавить следующее в ваш конструктор после вызова InitiliseComponent.

SetStyle(ControlStyles.OptimizedDoubleBuffer | 
         ControlStyles.UserPaint |
         ControlStyles.AllPaintingInWmPaint, true);

EDIT:

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

8 голосов
/ 11 декабря 2008

Я вытащил это из работающей программы на C #. Другие постеры имеют синтаксические ошибки и четко скопированы из C ++ вместо C #

SetStyle(ControlStyles.OptimizedDoubleBuffer | 
                        ControlStyles.UserPaint |
                        ControlStyles.AllPaintingInWmPaint, true);
1 голос
/ 17 сентября 2008

Может быть достаточно просто позвонить

SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true);

Мерцание, которое вы видите, скорее всего, потому что Windows сначала рисует фон элемента управления (через WM_ERASEBKGND), затем просит ваш элемент управления сделать то, что вам нужно сделать (через WM_PAINT). Отключение фоновой краски и выполнение всей рисования в переопределении OnPaint может устранить проблему в 99% случаев без необходимости использования всей памяти, необходимой для двойной буферизации.

0 голосов
/ 15 сентября 2008

Вы говорите, что пробовали двойную буферизацию, но затем вы говорите, что сначала рисуете изображение, а затем стираете его. Вы пытались установить DoubleBuffered = true в конструкторе, а не делать это самостоятельно с изображением?

...