C++里playsound函数到底如何使用?

C++里playsound函数到底如何使用?,第1张

//---------播放声音头文件和类型库

#include <mmsystem.h>

#pragma comment(lib,"winmm.lib")

一.播放声音文件的简单方法

在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的液孝绝播放声音方法就是直接调用VC++中提供的声音播放函数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound )或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound )其中参数lpszSound是需要播放声音的.W***文件的路径和文件名, hmod在这里为NULL,fuSound是播放声音的标志,详细说明请参考VC++中的帮助。 例如播放C:soundmusic.wav可以用sndPlaySound ("c:\sound\music.wav",SND_ASYNC)或PlaySound("c:\sound\music.wav",NULL, SND_ASYNC|SND_NODEFAULT )如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。二.将声音文件加入闹姿到程序中

在VC++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。同时VC++也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现无.W***文件的声音播放。

要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。假设生成的声音文件资源标识符为IDR_W***E1。在播放时只需要调用下面的语句:

PlaySound(MAKEINTRESOURCE(IDR_W***E1),AfxGetResourceHandle(), SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP)

其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄,

SND_RESOURCE是必须的标志。慎银

作为资源的声音文件的第二种播放方法是把资源读入内存后作为内存数据播放。具体步骤入下:

1.获得包含资源的模块句柄:

HMODULE hmod=AfxGetResourceHandle()

2.检索资源块信息:

HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_W***E1),_T("W***E"))

3. 装载资源数据并加锁:

HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource)

LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem)

4.播放声音文件:

sndPlaySound(lpMemSound,SND_MEMORY));

5.释放资源句柄:

FreeResource(hGlobalMem)

暂停这个问题没想过,不知道用线程能不能镇返缓解决;重复播放能解决。现在世枯要下班了,明天试过后回复吧(如果明天来的及御模的话- -!!!)。

试过了,无法暂停;重复播放你可以写一个死循环或直接在下面点start键。暂停还是另想办法吧。下面代码只能实现不独占控制权。

窗口代码:

unit Unit1

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls

type

TForm1 = class(TForm)

start: TButton

procedure startClick(Sender: TObject)

private

{ Private declarations }

public

{ Public declarations }

thre:TThread

end

var

Form1: TForm1

implementation

uses Unit2

{$R *.dfm}

procedure TForm1.startClick(Sender: TObject)

begin

thre:=mythread.Create(false)

thre.Priority:=tpNormal

thre.FreeOnTerminate:=true

end

end.

线程代码:

unit Unit2

interface

uses

Classes,

Mmsystem

type

mythread = class(TThread)

private

{ Private declarations }

protected

procedure Executeoverride

end

implementation

{ mythread }

{$R my.res}

procedure mythread.Execute

begin

playsound('mywav',hinstance,snd_sync or snd_resource)

end

end.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12287794.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存