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





Вы говорите, что пробовали двойную буферизацию, но затем вы говорите сначала рисовать в Image и копировать его. Вы пробовали установить DoubleBuffered = true в конструкторе вместо того, чтобы делать это самостоятельно с помощью Image?
Вы можете попробовать вставить в свой конструктор следующее после вызова InitiliseComponent.
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);
Обновлено:
Если вы попробуете, если можете, удалите свой собственный код двойной буферизации и просто заставьте элемент управления нарисовать себя в ответ на вызов соответствующих виртуальных методов.
Я согласен. Я также нашел хороший URL-адрес в другом вопросе, связанном с мерцанием. codeproject.com/KB/graphics/DoubleBuffering.aspx
Я пробовал так много разных решений, но это исправляет !! +1 за указание поставить его после InitializeComponent (); !! xoxoxo
Может быть достаточно просто вызвать
SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true);
Мерцание, которое вы видите, скорее всего, связано с тем, что Windows сначала рисует фон элемента управления (через WM_ERASEBKGND), а затем просит ваш элемент управления выполнить любой рисунок, который вам нужно сделать (через WM_PAINT). Отключение отрисовки фона и выполнение всего рисования в переопределении OnPaint может устранить проблему в 99% случаев без необходимости использования всей памяти, необходимой для двойной буферизации.
Я вытащил это из работающей программы на C#. Другие плакаты имеют синтаксические ошибки и явно скопированы с C++ вместо C#.
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);
Я обычно помещаю это перед Application.Run, но я думаю, что это лучшее решение этой проблемы.