C #: Scroll / AutoResize дочерних элементов управления в пользовательском элементе управления, медленная перекраска - PullRequest
1 голос
/ 05 марта 2011

В настоящее время я пишу пользовательский элемент управления, который должен содержать дочерний элемент управления и поддерживать прокрутку и авторизацию. Автопрокрутка невозможна, потому что мой элемент управления полностью самокрашен, и прокручивать должна только его часть.

Теперь перерисовка элементов управления очень медленная, особенно с текстовыми полями и кнопками с системным окрашиванием. Помогает деактивация системного окрашивания (TextBox.BorderStyle = Borderstyle.Fixed), но элемент управления также должен это поддерживать. Использование SetRedraw и последующее обновление элементов управления не помогает, потому что текстовое поле systemdraw игнорируется, а текстовое поле выглядит безобразно. Обновление всего элемента управления или использование `RedrawWindow снова замедляет рисование.

Я также уже пытался приостановить макет элемента управления и дочерних элементов управления безуспешно.

Кто-нибудь знает, как ускорить рисование дочернего элемента управления, как AutoScrolling.

Мой CustomControl имеет стиль ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor | ControlStyles.OptimizedDoubleBuffer.

Граница ChildControl изменяется при изменении размера (MyControl) и (ScrollBar) OnValueChanged.

Использование таймера немного помогает, но я не знаю, действительно ли это правильное решение.

РЕДАКТИРОВАТЬ: Я обнаружил проблему, после реактивации SetRedraw и Refresh, OnPaint срабатывает 38 раз с 37 Controls. Есть ли обходной путь?

Ответы [ 2 ]

1 голос
/ 05 марта 2011

С таким количеством элементов управления он замедляется, 37 из них - довольно много. Для сравнения, Microsoft Outlook использует около 50 окон, у вас есть 38 для одного элемента управления. Он становится слишком медленным из-за эффектов прозрачности для этих элементов управления. Метод OnPaint () выполняется так часто, что обеспечивает фоновые пиксели элементов управления. Вы не всегда можете это исправить, например, Button собирается позволить своему родителю нарисовать фон, даже если он не прозрачен. Органы управления очень удобны, но они не дешевые.

Только один способ действительно продвинуться здесь: прекратить использовать так много элементов управления и перестать пытаться поддерживать прозрачность. Не уверен, что вы используете, но этикетка, например, особенно расточительна. Использование TextRenderer.DrawText в вашем методе OnPaint также может нарисовать метку за вычетом стоимости элемента управления.

0 голосов
/ 08 марта 2011

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

...