[MFC] MFC 用mciSendString加载WAV资源文件
@ - @
FIRDST:为什么不用路径加载?
因为mciSendString函数不支持加载资源文件里的WAV资源,如果按路径加载,那么你的WAV就暴露在exe之外,无法实现音频资源的很好保护。
SECOND:为什么不用PlaySound(MAKEINTRESOURCE(IDR_WAVE_HIT),AfxGetResourceHandle(),SND_RESOURCE|SND_ASYNC);直接加载资源文件播放呢?
其实这样是可以的,但是这里有2方面考虑:首先PS函数不能加载mp3格式文件,其次有时候游戏编写过程中同时使用PS函数和mciSS函数可以实现混音效果,如果只用PS函数就只能播放一种音乐出现麻烦!
- bool ExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName){//中间调用函数
- // 创建文件
- HANDLE hFile = ::CreateFile(strDstFile, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);
- if (hFile == INVALID_HANDLE_VALUE)
- return false;
- // 查找资源文件中、加载资源到内存、得到资源大小
- HRSRC hRes = ::FindResource(NULL, strResName, strResType);
- HGLOBAL hMem = ::LoadResource(NULL, hRes);
- DWORD dwSize = ::SizeofResource(NULL, hRes);
- // 写入文件
- DWORD dwWrite = ; // 返回写入字节
- ::WriteFile(hFile, hMem, dwSize, &dwWrite, NULL);
- ::CloseHandle(hFile);
- return true;
- }
- //--------------------------------------------------------------
- void init(){//初始化函数
- // 产生临时文件的文件名
- TCHAR tmpwav[_MAX_PATH];
- ::GetTempPath(_MAX_PATH,tmpwav);
- _tcscat_s(tmpwav, _T("testapp_background.wav")); // VC2008、VC2010 请用 _tcscat_s 函数
- // 将wav 资源提取为临时文件
- //ExtractResource(tmpwav,_T("WAVE"), "background.mp3");
- // 注:如果wave资源的 ID 为宏 IDR_BACKGROUND,这样做:
- ExtractResource(tmpwav, _T("WAVE"), MAKEINTRESOURCE(IDR_WAVE_POINT));
- // 打开音乐
- TCHAR mcicmd[];
- _stprintf_s(mcicmd, _T("open \"%s\" alias mymusic"),tmpwav); // VC2008、VC2010 请用 _stprintf_s 函数
- mciSendString(mcicmd, NULL,, NULL);
- // 播放音乐
- mciSendString(_T("play mymusic"), NULL, , NULL);
- // 停止播放并关闭音乐
- mciSendString(("stop mymusic"), NULL, , NULL);
- mciSendString(("close mymusic"), NULL, , NULL);
- // 删除临时文件
- DeleteFile(tmpmp3);
- }
- //--------------------------------------------------------------
- //如果是初始化里的情况只能播放一次,想要多次播放,先要把mcicmd[]设为全局变量
- //再把:下面几条语句注释掉
- //mciSendString(mcicmd, NULL,0, NULL);
- //mciSendString(_T("play mymusic"), NULL, 0, NULL);
- //mciSendString(("stop mymusic"), NULL, 0, NULL);
- //mciSendString(("close mymusic"), NULL, 0, NULL);
- //DeleteFile(tmpmp3);
- //再在该调用的位置使用下面的play函数!!!
- void play(){//播放函数
- mciSendString(_T("close mymusic"), NULL, , NULL);//先关再开,注意顺序!!!
- mciSendString(mcicmd, NULL,, NULL);
- mciSendString(_T("play mymusic"),NULL,, NULL);
- }//------------------------------------------------------------
[MFC] MFC 用mciSendString加载WAV资源文件的更多相关文章
- Spark动态加载外部资源文件
Spark动态加载外部资源文件 1.spark-submit --files 动态加载外部资源文件 之前做一个关于Spark的项目时,因项目中需要读取某个静态资源文件,然后在本地IDEA测试一切皆正常 ...
- spark-submit --files 动态加载外部资源文件
在做spark时,有些时候需要加载资源文件,需要在driver或者worker端访问.在client模式下可以使用IO流直接读取,但是在cluster模式下却不能直接读取,需要如下代码: val is ...
- 引入外部 CDN失效时--怎么加载本地资源文件(本文以jquery为例)
相信大家都使用过CDN静态资源库,比如下面 CDN官方静态资源库:https://cdnjs.com/ 七牛前端公开库:http://staticfile.org (vue,react,nl都有) ...
- 不停服务,动态加载properties资源文件
系统运行过程中,我们用注解@Value("${****}")可以获取资源文件中的内 容,获取的内容会被存储在spring缓存中,因此如果我们修改了资源文件,要 想读取到修改后的内容 ...
- 如何重载浏览器 onload 事件后加载的资源文件
http://www.oschina.net/translate/reloading-post-onload-resources?lang=eng 怎么在webview中加载本地jquery.mi.j ...
- 在PyQt中直接使用ui文件并加载qrc资源文件
1. 用Qt设计师创建一个包含qrc资源文件的ui文件 2.打开cmd使用以下命令把qrc资源文件转换成十六进制的py文件 pyrcc4 -o C:\res.py C:\res.qrc pyrcc4 ...
- (转)spring boot实战(第六篇)加载application资源文件源码分析
原文:http://blog.csdn.net/liaokailin/article/details/48878447
- MFC使用LoadBitmap方法加载位图文件失败解决方案(转)
用如下方法在原项目中使用LoadBitmap方法加载已有的位图资源作为背景没有问题,但放在别的项目中总是加载不出来,该函数返回NULL HBITMAP hBitmap=LoadBitmap((HINS ...
- 填补Resources和WWW加载本地资源的坑
总的来说Resources和WWW加载本地资源坑比较多,大多与路径有关. 下面代码构成了一个路径的预读模块: 此模块主要解决的坑是:Resources或WWW加载本地的文件夹中的多个文件时,无法获取文 ...
随机推荐
- VBS 相关知识 笔记
1.Option Explicit: 必须声明了变量之后才能赋值. 原话:语句在模块级别中使用,强制显式声明模块中的所有变量. w3scholl看到的内容: 变量声明 您可以使用 Dim.Publi ...
- 编程范式 epesode2 negative values, float 精度
episode2 //it is very interesting,an excellect teacher, I love it 1,why negative is indicated the w ...
- 测试table数据 winfrom datagridview 点击标头数字排序的时候table 列类型要为数字类型
public DataTable GenerateData(int NoOfRecord){DataTable tbl = new DataTable();tbl.Columns.Add(new Da ...
- ContentProvider 增删改查通讯录
一.通讯录应用介绍 通讯录应用是Android自带的应用程序,我们看到此应用的时候,可能只认为这是一个应用,用数据库存储数据,但是实际上不是这样的. 通讯录是ContentProvider的应用,通讯 ...
- ASP.NET 创建网站地图
很多个人站长会使用工具来生成自己网站的站点地图,这样做的缺点在于网站的 sitemap 不能及时的得到更新.当我们发表了一篇新文章时,应该对网站的地图进行更新,并通知搜索引擎网站地图已经发生了改变! ...
- Block的copy和循环引用的问题
在实际开发中,发现使用Block有着比delegate和notification更简洁的优势.于是在目前的项目中大量的使用block. 在我的头文件我是这样声明使用block的. 我将block声明为 ...
- jQuery.cookie
了解cookie先了解一下知识点: Navigator (一般是浏览器)对象包含有关浏览器的信息. Navigator userAgent:是一个只读字符串,声明了浏览器用于HTTP请求的用户代理头的 ...
- 加密算法—MD5、RSA、DES
最近因为要做一个加密的功能,简单了解了一下加密算法,现在比较常用的有三个加密算法MD5加密算法.RSA加密算法.DES加密算法. MD5加密算法 定义:MD5算法是将任意长度的“字 ...
- echo 换行不换行
echo换行输出需要转义符 -e 看以下例子: echo -e "It is the first line." >> a; echo -e "It is th ...
- 20145225 《Java程序设计》第2周学习总结
20145225<Java程序设计> 第2周学习总结 教材学习内容总结 3.1.1Java的类型 分为基本类型(Primitive type)和类类型(Class type) 基本类型: ...