Анимация 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 шт):
Ваш курсор нужно поместить на панель (вместо неё у вас там раньше был похожий белый 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();
