.NET PowerPacks RectangleShape мерцает при изменении размера формы

Я могу сделать что-то простое, например:

  1. Создайте новое приложение формы .NET
  2. Поместите один объект RectangleShape на форму
  3. добавьте следующее в метод InitializeComponent в коде конструктора

    Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or _
        ControlStyles.UserPaint Or _
        ControlStyles.DoubleBuffer, True)
    Me.UpdateStyles()
    
  4. Запустить программу
  5. Изменить размер формы
  6. Сердито наблюдайте, как прямоугольник мерцает

Можно ли избавиться от этого? Или ShapeContainer имеет внутренние недостатки, и мне нужно найти другое решение?


person Phil    schedule 05.07.2011    source источник


Ответы (2)


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

В противном случае это довольно дорогой способ рисования фигур. Дешевый способ без мерцания — использование e.Graphics.FillRectangle() в переопределении формы OnPaint() или обработчике события Paint.

person Hans Passant    schedule 05.07.2011
comment
Хорошо, проверьте это сами, но я вижу большую разницу при двойной буферизации формы. Он по-прежнему мерцает с формой двойной буферизации, но если вы выполните мои шаги — переключение двойного буфера между запусками — вы заметите это. Помимо этого, спасибо за ваше подтверждение того, что инструмент неисправен. Я воспользуюсь вашим предложением. - person Phil; 05.07.2011

Я никогда не использовал ShapeContainer, но всякий раз, когда я делаю такую ​​​​настраиваемую графику, я создаю подкласс для панели и в конструкторе своего подкласса устанавливаю для DoubleBuffered значение true.

Более конкретный пример кода здесь.

person Corey Ogburn    schedule 05.07.2011
comment
Да, к сожалению, класс ShapeContainer не наследуется. Это была и моя первая попытка: Предыдущий вопрос - person Phil; 05.07.2011