(翻译)在Win Forms程序中嵌入和播放声音资源
作者:salysle
原文地址:http://www.codeproject.com/KB/audio-video/PlayWavFiles.aspx
内容摘要
这篇文章演示了如何把wav声音资源文件嵌入到应用程序中,并通过System.Media类库来播放。
介绍
这篇文章演示了一种方法,如何把wav声音资源文件嵌入到应用程序中,并通过System.Media类库来播放。
借助于System.Media类库,这个例子中我们不需要引用winmm.dll来播放声音资源,并且代码更易于实现。
声音文件被直接嵌入到程序中,这使我们在部署程序时不需要添加额外的声音文件到安装包中。此外,这种方法也排除了文件不存在或被删除的可能,
它会导致程序需要资源时找不到需要使用的声音文件。
图 1 示例应用程序窗体
开始
在下载的源代码中,包含只有一个以PlayWavFiles命名的项目的解决方案。这个项目如图2所示,该项目包含默认的Win Forms的引用,资源直接嵌入到了应用程序资源中,不需要在安装时再分发资源。
这个例子是用C#语言编写,用Visual Studio 2005集成开发环境编译,您可以打用IDE打开来检查代码。
添加声音文件资源
为了添加资源文件到解决方案中,在解决方案浏览器中打开Resources.resx文件。打开后,您可以看到一个下拉选择框,如图3,它是用来选择添加到项目中的资源的类型。选择Audio资源,然后点击Add Resource.
图 3 添加声音文件资源
当您点击Add Resource按钮后,弹出一个文件浏览对话框,您可以找到声音文件,然后加入到应用程序资源中。
当声音文件添加到应用程序资源文件件中后,依次选择每一个声音资源,然后设置它们的Persistence(持久性)属性为Embedded in .resx(嵌入到resx文件中)
图 5 设置添加的声音文件的Persistence属性
到现在为止,声音文件已经被添加到项目中,并且设置好了属性,您可以在项目中使用声音资源了。
代码 :主窗口
本例子应用程序只包含一个窗体(frmMain)文件,它包含了所有播放嵌入声音文件的必要的代码。除了导入(import)一些必要的类库外,您还需要添加System.Media的引用。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Media;
namespace PlayWavFiles
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
所有的必要的代码包含在三个按钮的点击事件中;退出按钮用来退出应用程序:
private void btnExit_Click(object sender, EventArgs e)
{
Application.Exit();
}
这个按钮的点击事件有用来播放嵌入的wav文件,它只播放一次。
private void btnDemo1_Click(object sender, EventArgs e)
{
try
{
SoundPlayer sndplayr = new
SoundPlayer(PlayWavFiles.Properties.Resources.BuzzingBee);
sndplayr.Play();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ": " + ex.StackTrace.ToString(),
"Error");
}
}
在按钮的点击事件代码中,创建SoundPlayer类的实例,设置它的构造函数参数为需要播放的应用程序资源。当资源被加载到SoundPlayer的实例中后,调用Play方法播放声音。
这个按钮的点击事件演示了如何循环播放嵌入的声音文件:
private void btnDemo2_Click(object sender, EventArgs e)
{
try
{
SoundPlayer sndplayr = new
SoundPlayer(PlayWavFiles.Properties.Resources.LoopyMusic);
if (btnDemo2.Text == "Demo WAV 2")
{
sndplayr.PlayLooping();
btnDemo2.Text = "STOP";
}
else
{
sndplayr.Stop();
btnDemo2.Text = "Demo WAV 2";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ": " + ex.StackTrace.ToString(),
"Error");
}
}
这个例子的代码与上一个例子相似,不同的是,它调用的是PlayLooping方法而不是Play方法。当调用这个方法,被加载的wav文件将会循环播放,直到您调用它播放另一个wav文件或是调用Stop方法。为了支持这个特性,当开始循环播放时,按钮的文字应该改为STOP,当用户点击STOP文字的按钮时,Stop方法被调用,并且按钮的文字恢复为初始的文字,随后的点击会播放声音文件,然后是停止,按钮的行为表现为交替更新这两个选项。
总结
这个范例提供了如何在应用程序资源文件中嵌入声音资源,以及如何检索声音文件并且使用System.Media类库来播放。相似的功能也可以通过使用winmm.dll来获取,当然,这种方法只需要更少的代码,并且从部署的角度来讲,它更安全。