Консультация № 170785
25.07.2009, 15:06
0.00 руб.
0 12 1
Здраствуйте Уважаемые эксперты. У меня будет несколько вопросов на счет того как в Visual C++ работать со звуком. Как при нажатии на метку, кнопку, панель и т д сраюбатывал звуковой сигнал находящийся в каталоге программы? Какого он должен быть формата? Заранее спасибо.

Обсуждение

Неизвестный
25.07.2009, 15:34
общий
Вы создаете mfc приложение?
Неизвестный
25.07.2009, 15:39
общий
Windows Form Appilication
Неизвестный
25.07.2009, 18:49
общий
это ответ
Здравствуйте, Dimon4ik.

Windows Forms - это проект с использованием .Net. Для проигрывания простых звуков есть пространство имен System::Media.

Так можно проиграть любой wav-файл. Во избежание проблем лучше использовать несжатые файлы (PCM)
Код:

System::Media::SoundPlayer SP(L"c:\\Windows\\Media\\ding.wav");
SP.Play();


А так можно проиграть стандартный системный звук. Если этот звук отключен в панели управления, то и звука не будет. Это очень полезная штука для "профессиональных" программ. Вместо Exclamation можно выбрать подходящий.
Код:

System::Media::SystemSounds::Exclamation->Play();


Первый метод полезен практически только для игрушек, а второй для вменяемых программ, которые подчиняются пожеланиям пользователя.
5
Неизвестный
27.07.2009, 11:19
общий
а возможно ли привязать к каталогу в котором программа звук. Чтобы при копировании на другой компьютер в другое место папки с приложением и файлами файл запускался?
Неизвестный
27.07.2009, 13:34
общий
String^ StartPath=Path::GetDirectoryName(Application::ExecutablePath);
System::Media::SoundPlayer SP(Path::Combine(StartPath, "ding.wav"));
SP.Play();

Проверьте содержимое переменной StartPath. При дебаге путь запуска может быть черт знает где. У каждого языка в студии свои стандартные настройки.
Неизвестный
27.07.2009, 13:53
общий
Вставил строчку

private: System::Void textBox1_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {
String^ StartPath=Path::GetDirectoryName(Application::ExecutablePath);
System::Media::SoundPlayer SP(Path::Combine(StartPath, "k.wav"));
SP.Play();


}

Появились ошибки...Наверное я чтото не так понял...

Error 50 error C2653: 'Path' : is not a class or namespace name d:\c++ proj\project1\xo\xo\Form1.h 1022
Error 52 error C2653: 'Path' : is not a class or namespace name d:\c++ proj\project1\xo\xo\Form1.h 1023
Error 53 error C3861: 'Combine': identifier not found d:\c++ proj\project1\xo\xo\Form1.h 1023
Error 51 error C3861: 'GetDirectoryName': identifier not found d:\c++ proj\project1\xo\xo\Form1.h 1022

Неизвестный
27.07.2009, 14:20
общий
Сверху допишите строчку к таким же.
using namespace System::IO;

Запомните эту ошибку - они будут возникать частоНажимаете F1 на непонятном ему имени и смотрите в справке, к какому пространству имен относится данный класс.
Неизвестный
27.07.2009, 14:34
общий
О! Отлично! Спасибо. А как сделать чтобы прекратило музыку играть?
Неизвестный
27.07.2009, 14:46
общий
Так у него метод Stop есть. Тогда надо сделать эту переменную элементом объекта. Тогда можно его создавать в одной функции, запускать в другой, останавливать в третьей.
Неизвестный
27.07.2009, 15:48
общий
Можете примерно показать как это должно работать? Пожалуйста.
Неизвестный
27.07.2009, 16:19
общий
Куски кода:

Form1(void)
{
InitializeComponent();
SP=gcnew SoundPlayer(Path::Combine(Path::GetDirectoryName(Application::ExecutablePath), "ding.wav"));
}

SoundPlayer^ SP;

private: System::Void btnStart_Click(System::Object^ sender, System::EventArgs^ e) {
SP->Play();
}

private: System::Void btnStop_Click(System::Object^ sender, System::EventArgs^ e) {
SP->Stop();
}
Неизвестный
27.07.2009, 16:29
общий
Спасибо. Теперь понятно. Все работает.
Форма ответа