[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加载本地的文件夹中的多个文件时,无法获取文 ...
随机推荐
- C# 定制 Attribute 简单使用
所谓 “定制Attribute”,就是一个类的实例,它被序列化成驻留在元数据的一个字节流. 我们可以使用 Attribute 来保存注释: namespace AttributeDemo { [Att ...
- 循序渐进Python3(三) -- 3 -- 内置函数
上一篇我们又介绍了26个Python内置函数.现回忆一下吧: 1.all 2.any 3.ascii 4.bin 5.bool 6.bytes 7.bytearray 8.callable 9.chr ...
- INNO SETUP 5.5.0以上版本中文语言包
; *** Inno Setup version 5.5.0+ Chinese messages ***;; To download user-contributed translations of ...
- winfrom中DataGridView绑定数据控件中DataGridViewCheckBoxColumn怎么选中
; i < this.dataGridView1.Rows.Count; i++) { this.dataGridView1.Rows[i].Cells["CheckBoxCulums ...
- js浮点数计算问题 + 金额大写转换
一 js浮点数计算问题解决方案: 1.使用 NumberObject.toFixed(num) 方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 2.较精度计算浮点数 ...
- Java签名
有的时候会忘记签名,想想还是在博客里面记录下,,省的我忘了还要去翻文档,哈哈: 除了boolean, long,类型其他的基本类型都是首字母大写: Java类型 类型描述符 boolean Z ch ...
- Sql 常见面试题
SQL面试题(1) create table testtable1(id int IDENTITY,department varchar(12) ) select * from testtable1i ...
- java中final,finally和finalize的区别
final,finally和finalize的区别: final:最终的意思,可以修饰类,成员变量,成员方法 修饰类,类不能被继承 修饰变量,变量是常量 修饰方法,方法不能被重写 finally:是异 ...
- 1064. Complete Binary Search Tree (30)
分析: 考察BST + 完全二叉树的性质,注意: (1):先用排序排好,然后由于是完全二叉树,我们使用中序来建树. (2):建好之后,层次遍历可以采用队列. #include <iostream ...
- UVAL1277_Cops and Thieves
单源点汇点无向图,要阻隔某个点的流量,必须在一个点上消耗一定的价值,问你能否在消耗价值不超过k的前提下,阻隔源点到汇点的流量. 直接对于有权值的点拆点,拆后边容量即为点权.其余的点的容量无穷,最大流即 ...