Застрял, пытаясь заставить мой текстовый скроллер c # работать гладко - PullRequest
0 голосов
/ 11 октября 2011

Я делаю небольшой проект, где мое приложение vc # должно включать текстовый скроллер / тикер новостей.Приложение будет работать на 30+ экранах, демонстрирующих внутреннюю рекламу на моем рабочем месте.Я уже несколько месяцев гуглю и тестирую, но еще не нашел / не нашел хорошего решения, где движение плавное и не прерывистое.

Поэтому мой вопрос: возможно ли создать идеальное плавное движение?прокрутить движение в c # или мне нужно пойти по-другому?

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

Вот код, который я использую:

namespace ScrollDemo1
{
public partial class NewsTicker : Panel
{
    private Timer mScroller;
    private int mOffset; 
    private string mText;
    private Size mPixels;
    private Bitmap mBuffer;
    public NewsTicker()
    {
        mScroller = new Timer();
        mScroller.Interval = 1;
        mScroller.Enabled = false;
        mScroller.Tick += DoScroll;
    }
    [Browsable(true)]
    public override string Text
    {
        get { return mText; }
        set
        {
            mText = value;
            mScroller.Enabled = mText.Length > 0;
            mPixels = TextRenderer.MeasureText(mText, this.Font);
            mOffset = this.Width;
        }
    }
    protected override void OnPaintBackground(PaintEventArgs e)
    {
    }
    private void DoScroll(object sender, EventArgs e)
    {
        mOffset -= 1;
        if (mOffset < -mPixels.Width) mOffset = this.Width;
        Invalidate();
        Update();
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        if (mBuffer == null || mBuffer.Width != this.Width || mBuffer.Height != this.Height)
            mBuffer = new Bitmap(this.Width, this.Height);
        Graphics gr = Graphics.FromImage(mBuffer);
        Brush bbr = new SolidBrush(this.BackColor);
        Brush fbr = new SolidBrush(this.ForeColor);
        Bitmap bmp = global::ScrollDemo1.Properties.Resources.text_bg1;
        TextureBrush tb = new TextureBrush(bmp);
        int iLoc = (this.Height / 2) - (mPixels.Height / 2);
        //Console.WriteLine(iLoc.ToString());
        //gr.FillRectangle(bbr, new Rectangle(0, 0, this.Width, this.Height));
        gr.FillRectangle(tb, new Rectangle(0, 0, this.Width, this.Height));
        gr.DrawString(mText, this.Font, fbr, mOffset, iLoc);
        e.Graphics.DrawImage(mBuffer, 0, 0);
        bbr.Dispose();
        fbr.Dispose();
        gr.Dispose();
    }
}
}

1 Ответ

1 голос
/ 11 октября 2011

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

...