Анимация Picture box+trackbar

Я создал в WinForms панель радиоприёмника. На ней trackBar, lable-ы и textBox-ы. Программа, при перидвижение ползунка trackBar-а, менят значение частоты, отображаемое в верхнем textBox-е. Частота меняется от 500 до 1600 килогерц.

В коде описана формула вычисления: промежуточная частота (ПЧ) = частота гетеродина - частота радиостанции. ПЧ отображается в textBox-е.

Подскажите, пожалуста, как сделать, чтобы при перемещении ползунка у меня двигалась стрелка в pictureBox-е (красный вертикальный прямоугольник)?

Архив с программой тут.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace radiodualnew
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }



        private void stationfrequencytrackbar_Scroll(object sender, EventArgs e)
        {
            
           
        }

        private void stationfrequencytxtbox_TextChanged(object sender, EventArgs e)
        {

        }



        private void geterodynefrequencytxtbox_TextChanged(object sender, EventArgs e)
        {
            
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            int stationfreq = stationfrequencytrackbar.Value; // настройка на частоту радиостанции
            const int geterodinediff = 465;                     // постоянная частота разница 465
            int resultgeterodindiff;
            int iffreq;

            //сверху назначаем переменные//



            stationfrequencytxtbox.Text = stationfreq.ToString();   //Показываем частоту радиостанции в текстбоксе
            red_cursor.Location = 

            resultgeterodindiff = stationfreq + geterodinediff;     //сумма частоты радиостанции + частоты разницы гетеродина 

            geterodynefrequencytxtbox.Text = resultgeterodindiff.ToString();    //частоту гетеродина выводим в текстбокс 

            iffreq = resultgeterodindiff - stationfreq;     // результат частоты гетеродина вычитаем из частоты радиостанции получаем промежуточную частоту IF

            iffreqtxtbox.Text = iffreq.ToString(); // промежуточную частоту выводим на текстбокс
            


            this.Update();
            this.Refresh();


        }

        private void red_cursor_Click(object sender, EventArgs e)
        {
            
        }
    }
}

Ответы (1 шт):

Автор решения: KuzCode

Ваш курсор нужно поместить на панель (вместо неё у вас там раньше был похожий белый pictureBox).

Также нужно добавить следующий код:

private void stationfrequencytrackbar_Scroll(object sender, EventArgs e)
{
    var normilizedMaximum = stationfrequencytrackbar.Maximum - stationfrequencytrackbar.Minimum; // рассчитываем нормализованный максимум (тоесть при минимуме равном нулю)
    var normilizedValue   = stationfrequencytrackbar.Value - stationfrequencytrackbar.Minimum; // рассчитываем нормализованное значение (тоесть при минимуме равном нулю)
    var percents          = (float)normilizedValue * 100 / normilizedMaximum; // расчитываем процент продвижения ползунка трекбара
    var newX              = percents / 100 * (red_cursor.Parent.Width - red_cursor.Width); // расчитываем новый X стрелочки

    red_cursor.Location = new Point((int)newX, red_cursor.Location.Y);
    red_cursor.Parent.Refresh();          
}

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

this.Update();
this.Refresh();

введите сюда описание изображения

→ Ссылка