Плавная прокрутка текста в C # - PullRequest
2 голосов
/ 08 октября 2010

Я хотел бы иметь текст, который плавно прокручивается на моей форме окна c #.

Я пытался определить, что метка с текстом на нем перемещается пиксель за пикселем, но это не гладкокак анимации, созданные во флэш-памяти.

как мне получить такую ​​плавную анимацию?

заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 09 октября 2010

Я пытался это сделать, и у меня есть хорошие и плохие новости.

Хорошая новость в том, что это возможно.Я тестирую код прямо сейчас и могу добиться абсолютно гладкой плавной прокрутки текста даже с помощью GDI +.

Сложность в том, что есть немало вещей, которые вы должны обеспечить / реализовать, чтобы иметь его:

  1. Установите для DoubleBuffered значение true на поверхности рендеринга (например, на своей форме).
  2. Вы должны нарисовать текст самостоятельно, класс Label не подойдет (см. Следующий пункт относительно причины).
  3. Вам нужно разрешение с плавающей точкой в ​​вашем коде рисования (позиционирования), что означает, что вы должны использовать TextRenderingHint.AntiAlias ​​в вызовах DrawString () и шрифты большего размера (> 10-12 pt), чтобы он выглядел хорошо.
  4. Вам нужен компонент таймера с очень высоким разрешением.Я использую компонент, основанный на мультимедийных таймерах Win32 в winmm.dll, который обеспечивает частоту событий таймера до 1000 Гц и почти абсолютную точность (стандартное отклонение ниже 0,1 мс).Google для компонента MultimediaTimer.(Кстати, я знаю, что это больше не решение, рекомендованное MS, но оно отлично работает даже в Windows 7.)
  5. Кроме того, мультимедийный таймер Windows имеет разрешение в миллисекундах, которое не может дать вам идеальноеОбновление 60 Гц (1000/60 не является целым числом), поэтому вам нужно будет реализовать какой-то механизм подсчета обновлений дисплея с плавающей запятой, чтобы максимально приблизиться к частоте обновления дисплея.Что-то вроде

    float tickCount = 0.0f;
    float tickDelta = 1000.0f / 60.0f;
    
    
    void mmTimer_Tick(object sender, EventArgs e)
    {
        tickCount++;
        if (tickCount >= tickDelta)
        {
            tickCount -= tickDelta;
            // scroll your text here 
            Invalidate();
        }
    }
    

    подойдет.

  6. Наконец, иногда может произойти небольшой разрыв.Это почти неизбежно, поскольку у вас нет доступа к видеорегистраторам с вертикальной синхронизацией.Поэкспериментируйте с таймингами для устранения разрывов.

Я искренне надеюсь, что это поможет.Дайте мне знать, если у вас возникнут проблемы с его реализацией.

0 голосов
/ 09 октября 2010

Если вы переопределите свойство CreateParams, доступное только для чтения, в своей форме и добавите WX_COMPOSITE (0x2000000, я думаю, что он составной) к параметрам. Это работает только на XP и выше, но перестает мигать, когда DoubleBuffer не работает.

0 голосов
/ 08 октября 2010

Я предполагал, что вы используете двойную буферизацию, потому что без нее ваш текст будет мигать и будет выглядеть не очень хорошо.

Существует проблема с GDI, которая у вас, вероятно, есть, и вы перемещаетесьскорость не синхронизируется с частотой обновления монитора.

Если у вас, например, ЖК-монитор 60 Гц, вам следует обновлять положение текста каждые 1000/60 мс, но если вы используете таймер для этого, вы будете испытывать рывкиа затем.

...