Я использую MSVB2005. Я бы хотел написать пользовательский элемент управления, который является автоматическим скроллером, прокручивая фиксированный текст по вертикали, плавно, например. пиксель на пиксель (и нет line-by-line). Это также известно как Marquee (в HTML, например).Использование контрольного вертикального скроллера для формирования выделения
Я уже реализовал такой элемент управления, используя таймер, который на каждом из его тиков выводит текст на поверхность элемента управления 1 пиксель вверх. Он работает очень хорошо, НО потребляет довольно большую мощность процессора, так как графическое аппаратное ускорение не используется, и все вычисления вычислений «падают» на основной процессор.
Я хотел бы улучшить производительность управления с помощью графических механизмов, встроенных в ОС (например, Windows), таких как вертикальный скроллер формы/управления. Я уверен, что ОС использует аппаратное ускорение снизу.
Я думал, что мой пользователь-контроль может наследовать от классаScrollableControl, или из другого класса, который наследует ScrollableControl, такие как панель. я сделал это, и после каждого тика вышеупомянутого таймера - выполняется следующее:
Y += 1
Me.AutoScrollPosition = New Point(0, Y)
, где Y
является классом-членом, и, следовательно, увеличивается на единицу после каждого тика таймера. Это тоже хорошо работает, НО:
1) только если текст-рендеринг выполняется при каждом вызове OnPaint
обработки события элемента управления. Если бы так ... Что было получено этой формой решения? (Текст-рендеринг, кажется, та часть, которая потребляет большую часть процессорного времени)
Есть ли способ, чтобы сделать весь текст только один раз для управления поверхностью, и имеют ОСА полностью управлять прокруткой, то есть пусть OS автоматически перерисовывает видимую область элемента управления при каждом перемещении вертикального скроллера (без необходимости перекрашивать соответствующую часть текста при каждом вызове OnPaint)?
2) Видимая вертикальная полоса прокрутки. Мне нужно, чтобы оно было активным, но не видно.
Ваша помощь будет очень обязательна.
P.S.
Элемент управления предназначен для приложения Winforms, поэтому я не могу переключиться на WPF прямо сейчас. Я не знаком с DirectX и OpenGL, и у меня не было времени узнать какие-либо из этих технологий в ближайшее время. так что в настоящее время решение в любом из этих направлений не будет считаться выполнимым. Благодарю.
Спасибо за подробный ответ. Я пытаюсь Бит-Blitting. Я прочитал об этом и успешно написал приложение-бит-blitting между полями изображений, но не мог бить blit, чтобы сформировать поверхность-клиент-прямоугольник/управление. Я передаю текст только один раз в Picture-box, а затем при каждом тике вышеупомянутого таймера вызывается 'OnPaint', пытаясь разбить бит из Picture-Box (с вертикальным смещением) на' e. Graphics.GetHdc() '. Это не работает (исключение вызывается), вероятно, потому, что я не должен использовать 'GetHdc()'. Что мне делать? Если возможно, фрагмент будет отличным. – Bliss
Нигде в моем посте я не рекомендовал вам делать блинтинг самостоятельно. Я рекомендовал использовать ScrollWindowEx. –
OK ... Итак, я тестирую 'ScrollWindowEx' сейчас. какую структуру я должен использовать для аргументов 'prcScroll' и' prcClip' (которые, согласно MSDN, должны иметь тип «RECT», который недоступен на моем VB.Net)? Как эта структура должна быть использована для фактического типа этих аргументов - 'IntPtr'? Большое спасибо. – Bliss