Пользовательский элемент управления под modaldialog не перерисовывается при перемещении диалога - PullRequest
0 голосов
/ 07 января 2011

Что вызывает это?Другие элементы управления отображаются нормально ...

    public CustomControl()
    {
        SetStyle(ControlStyles.ResizeRedraw, true);
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        SetStyle(ControlStyles.UserPaint, true);
    }

Пользовательский элемент управления размещен в TableLayoutPanel.

...................

Редактировать: Для пояснения: предположим, у вас есть элемент управления размером с окно с небольшой модальной диалоговой формой сверху.Когда вы перемещаете диалоговое окно, это похоже на вашу картину с окном на элементе управления (границы на элементе управления нарисованы).Элемент управления не перерисовывается, как другие элементы управления в той же форме, например, montcalendar или другие пользовательские элементы управления.Кажется, я не могу найти причину этого?

Мелкая деталь артефакта рисования:

alt text

1 Ответ

2 голосов
/ 07 января 2011

Трудно сказать из фрагмента. Стандартная ошибка - рисовать через Control.CreateGraphics () вместо метода OnPaint (). Не будет работать, Windows позволяет запускать метод OnPaint, когда части элемента управления раскрываются. Который стирает все, что вы нарисовали. Другой режим сбоя происходит от элемента управления, который является оберткой для собственного элемента управления Window. UserPaint не поддерживается для этих типов элементов управления, собственный код Windows должен рисовать.


Это ясно из снимка экрана, обратите внимание, как текст в шахматном порядке. Это потому, что переопределение OnPaint () использует свойство e.ClipRectangle, чтобы выяснить, где рисовать. Это значение всегда меняется, когда вы медленно перетаскиваете окно через элемент управления, оно только сообщает вам, какую часть элемента управления необходимо перерисовать. не говорит вам , где рисовать. Это должно основываться на границах элемента управления, обычно это прямоугольник от (0,0) до (ClientSize.Width, ClientSize.Height).

Всегда используйте e.ClipRectangle только для оптимизации чертежа. Как пропуск дорогой детали чертежа, когда он находится за пределами прямоугольника отсечения. В остальном он маленький, Windows уже достаточно хороша для автоматического отсечения.

...