Вертикальная линия прокрутки по картинке - PullRequest
0 голосов
/ 31 октября 2018

Я создаю проигрыватель звуковых сэмплов на C # и загружаю картинку сэмпла в PictureBox. Пользователь нажимает кнопку «Воспроизведение», и теперь я хотел бы, чтобы вертикальная линия прокручивалась по изображению во время воспроизведения семпла.

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

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

Приветствуются общие идеи, а также примеры кода, которые укажут мне правильное направление.


РЕДАКТИРОВАТЬ: После комментариев Джими, я добавил пример кода ниже. Для краткости некоторые аспекты проекта не показаны (например, воспроизведение звукового образца), так как на этом этапе меня интересует только возможная оптимизация прокрутки вертикальной линии на изображении образца, которая должна быть максимально быстрой / плавной, насколько это возможно. .

public partial class frmPlaySample : Form
{
    // We have set up a form in designer mode with a Play sample button (btnPlay), a picturebox (pictureBox1) and a Timer (timer1)

    public frmPlaySample()
    {
        InitializeComponent();
    }

    private void frmPlaySample_Load(object sender, EventArgs e)
    {
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        pictureBox1.Image = Image.FromFile(@"C:\SamplePicture.jpg");
        timer1.Interval = 17; // Timer Interval is set to 17 to approximate 60 frames per second.
    }

    int line = 0;

    private void btnPlay_Click(object sender, EventArgs e)
    {
        line=0;
        timer1.Enabled=true;
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawLine(new Pen(Brushes.White), line,0,line,pictureBox1.Height);
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        pictureBox1.Invalidate(); // If we wanted to, we could invalidate a narrow rectangle, but that would make things only slightly faster.
        line+=8; // This can be any amount. 8 is chosen arbitrarily.
        if(line>= pictureBox1.Width) { timer1.Enabled=false; line=0; }
    }

}
...