Обработка нажатия клавиш в C# и WindowsForms на примере синтезатора
В одной из предыдущих статей мы рассмотрели как создать простейший синтезатор на WindowsForms. На данный момент нажатие по клавишам синтезатора возможно при помощи клика мыши. В сегодняшней статье мы рассмотрим как использовать для этой цели ввод с клавиатуры в C# и WindowsForms.
Наша цель- это использование клавиш клавиатуры для нажатия по кнопкам синтезатора, а также отображение состояния нажатой клавиши.
Ниже приведен полный код.
using System.Media;
namespace WinFormsApp_Piano
{
public partial class Form1 : Form
{
private SoundPlayer _soundPlayer;
public Form1()
{
InitializeComponent();
// Включаем предварительное прослушивание клавиш формы
KeyPreview = true;
}
# метод для обработки ввода клавиатуры
private void MainForm_KeyDown(object sender, KeyEventArgs e)
{
Button buttonToClick = null;
switch (e.KeyCode)
{
case Keys.Q:
buttonToClick = button1;
break;
case Keys.W:
buttonToClick = button2;
break;
case Keys.E:
buttonToClick = button3;
break;
case Keys.A:
buttonToClick = button4;
break;
case Keys.S:
buttonToClick = button5;
break;
case Keys.D:
buttonToClick = button6;
break;
case Keys.Z:
buttonToClick = button7;
break;
case Keys.X:
buttonToClick = button8;
break;
}
if (buttonToClick != null)
{
HighlightButton(buttonToClick);
buttonToClick.PerformClick();
}
}
# метод для изменения состояния клавиши
private void HighlightButton(Button button)
{
// Временно меняем цвет фона кнопки
button.BackColor = SystemColors.GrayText;
// Создаем обработчики событий GotFocus и LostFocus для кнопки
button.GotFocus += Button_GotFocus;
button.LostFocus += Button_LostFocus;
// Принудительно вызываем событие GotFocus для кнопки
button.Focus();
}
# метод отслеживающий активность клавиши
private void Button_GotFocus(object sender, EventArgs e)
{
// Восстанавливаем исходный цвет фона кнопки при фокусировке
Button button = (Button)sender;
button.BackColor = SystemColors.Control;
}
private void Button_LostFocus(object sender, EventArgs e)
{
// Восстанавливаем исходный цвет фона кнопки при потере фокуса
Button button = (Button)sender;
button.BackColor = SystemColors.Control;
button.GotFocus -= Button_GotFocus;
button.LostFocus -= Button_LostFocus;
}
private void PlaySound(string soundFilePath)
{
_soundPlayer = new SoundPlayer(soundFilePath);
_soundPlayer.Play();
}
private void button1_Click_1(object sender, EventArgs e)
{
PlaySound(Полный путь к файлу\\zvuk-notyi-do.wav");
}
private void button2_Click(object sender, EventArgs e)
{
PlaySound("Полный путь к файлу\\zvuk-notyi-sol.wav");
}
private void button3_Click(object sender, EventArgs e)
{
PlaySound("Полный путь к файлу\\zvuk-notyi-lya.wav");
}
private void button4_Click(object sender, EventArgs e)
{
PlaySound("Полный путь к файлу\\zvuk-notyi-mi.wav");
}
private void button5_Click(object sender, EventArgs e)
{
PlaySound("Полный путь к файлу\\zvuk-notyi-si.wav");
}
private void button6_Click(object sender, EventArgs e)
{
PlaySound("Полный путь к файлу\\zvuk-notyi-re.wav");
}
private void button7_Click(object sender, EventArgs e)
{
PlaySound("Полный путь к файлу\\zvuk-notyi-fa.wav");
}
private void button8_Click(object sender, EventArgs e)
{
PlaySound("Полный путь к файлу\\zvuk-notyi-do-vo-vtoro-oktave.wav");
}
}
}
Таким образом, при нажатии по кнопкам клавиатуры будут воспроизведены звуки ноты, а также изменится внешний вид клавиши синтезатора.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.