@ - @  

  FIRDST:为什么不用路径加载?

  因为mciSendString函数不支持加载资源文件里的WAV资源,如果按路径加载,那么你的WAV就暴露在exe之外,无法实现音频资源的很好保护。

  SECOND:为什么不用PlaySound(MAKEINTRESOURCE(IDR_WAVE_HIT),AfxGetResourceHandle(),SND_RESOURCE|SND_ASYNC);直接加载资源文件播放呢?

   其实这样是可以的,但是这里有2方面考虑:首先PS函数不能加载mp3格式文件,其次有时候游戏编写过程中同时使用PS函数和mciSS函数可以实现混音效果,如果只用PS函数就只能播放一种音乐出现麻烦!

  1. bool ExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName){//中间调用函数
  2. // 创建文件
  3. HANDLE hFile = ::CreateFile(strDstFile, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);
  4. if (hFile == INVALID_HANDLE_VALUE)
  5. return false;
  6.  
  7. // 查找资源文件中、加载资源到内存、得到资源大小
  8. HRSRC hRes = ::FindResource(NULL, strResName, strResType);
  9. HGLOBAL hMem = ::LoadResource(NULL, hRes);
  10. DWORD dwSize = ::SizeofResource(NULL, hRes);
  11.  
  12. // 写入文件
  13. DWORD dwWrite = ; // 返回写入字节
  14. ::WriteFile(hFile, hMem, dwSize, &dwWrite, NULL);
  15. ::CloseHandle(hFile);
  16.  
  17. return true;
  18. }
  19. //--------------------------------------------------------------
  20. void init(){//初始化函数
  21. // 产生临时文件的文件名
  22. TCHAR tmpwav[_MAX_PATH];
  23. ::GetTempPath(_MAX_PATH,tmpwav);
  24. _tcscat_s(tmpwav, _T("testapp_background.wav")); // VC2008、VC2010 请用 _tcscat_s 函数
  25. // 将wav 资源提取为临时文件
  26. //ExtractResource(tmpwav,_T("WAVE"), "background.mp3");
  27. // 注:如果wave资源的 ID 为宏 IDR_BACKGROUND,这样做:
  28. ExtractResource(tmpwav, _T("WAVE"), MAKEINTRESOURCE(IDR_WAVE_POINT));
  29. // 打开音乐
  30. TCHAR mcicmd[];
  31. _stprintf_s(mcicmd, _T("open \"%s\" alias mymusic"),tmpwav); // VC2008、VC2010 请用 _stprintf_s 函数
  32. mciSendString(mcicmd, NULL,, NULL);
  33. // 播放音乐
  34. mciSendString(_T("play mymusic"), NULL, , NULL);
  35. // 停止播放并关闭音乐
  36. mciSendString(("stop mymusic"), NULL, , NULL);
  37. mciSendString(("close mymusic"), NULL, , NULL);
  38. // 删除临时文件
  39. DeleteFile(tmpmp3);
  40. }
  41. //--------------------------------------------------------------
  42. //如果是初始化里的情况只能播放一次,想要多次播放,先要把mcicmd[]设为全局变量
  43. //再把:下面几条语句注释掉
  44. //mciSendString(mcicmd, NULL,0, NULL);
  45. //mciSendString(_T("play mymusic"), NULL, 0, NULL);
  46. //mciSendString(("stop mymusic"), NULL, 0, NULL);
  47. //mciSendString(("close mymusic"), NULL, 0, NULL);
  48. //DeleteFile(tmpmp3);
  49. //再在该调用的位置使用下面的play函数!!!
  50. void play(){//播放函数
  51. mciSendString(_T("close mymusic"), NULL, , NULL);//先关再开,注意顺序!!!
  52. mciSendString(mcicmd, NULL,, NULL);
  53. mciSendString(_T("play mymusic"),NULL,, NULL);
  54. }//------------------------------------------------------------

[MFC] MFC 用mciSendString加载WAV资源文件的更多相关文章

  1. Spark动态加载外部资源文件

    Spark动态加载外部资源文件 1.spark-submit --files 动态加载外部资源文件 之前做一个关于Spark的项目时,因项目中需要读取某个静态资源文件,然后在本地IDEA测试一切皆正常 ...

  2. spark-submit --files 动态加载外部资源文件

    在做spark时,有些时候需要加载资源文件,需要在driver或者worker端访问.在client模式下可以使用IO流直接读取,但是在cluster模式下却不能直接读取,需要如下代码: val is ...

  3. 引入外部 CDN失效时--怎么加载本地资源文件(本文以jquery为例)

    相信大家都使用过CDN静态资源库,比如下面 CDN官方静态资源库:https://cdnjs.com/ 七牛前端公开库:http://staticfile.org   (vue,react,nl都有) ...

  4. 不停服务,动态加载properties资源文件

    系统运行过程中,我们用注解@Value("${****}")可以获取资源文件中的内 容,获取的内容会被存储在spring缓存中,因此如果我们修改了资源文件,要 想读取到修改后的内容 ...

  5. 如何重载浏览器 onload 事件后加载的资源文件

    http://www.oschina.net/translate/reloading-post-onload-resources?lang=eng 怎么在webview中加载本地jquery.mi.j ...

  6. 在PyQt中直接使用ui文件并加载qrc资源文件

    1. 用Qt设计师创建一个包含qrc资源文件的ui文件 2.打开cmd使用以下命令把qrc资源文件转换成十六进制的py文件 pyrcc4 -o C:\res.py C:\res.qrc pyrcc4 ...

  7. (转)spring boot实战(第六篇)加载application资源文件源码分析

    原文:http://blog.csdn.net/liaokailin/article/details/48878447

  8. MFC使用LoadBitmap方法加载位图文件失败解决方案(转)

    用如下方法在原项目中使用LoadBitmap方法加载已有的位图资源作为背景没有问题,但放在别的项目中总是加载不出来,该函数返回NULL HBITMAP hBitmap=LoadBitmap((HINS ...

  9. 填补Resources和WWW加载本地资源的坑

    总的来说Resources和WWW加载本地资源坑比较多,大多与路径有关. 下面代码构成了一个路径的预读模块: 此模块主要解决的坑是:Resources或WWW加载本地的文件夹中的多个文件时,无法获取文 ...

随机推荐

  1. VBS 相关知识 笔记

    1.Option Explicit: 必须声明了变量之后才能赋值.  原话:语句在模块级别中使用,强制显式声明模块中的所有变量. w3scholl看到的内容: 变量声明 您可以使用 Dim.Publi ...

  2. 编程范式 epesode2 negative values, float 精度

    episode2 //it is very interesting,an excellect teacher,  I love it 1,why negative is indicated the w ...

  3. 测试table数据 winfrom datagridview 点击标头数字排序的时候table 列类型要为数字类型

    public DataTable GenerateData(int NoOfRecord){DataTable tbl = new DataTable();tbl.Columns.Add(new Da ...

  4. ContentProvider 增删改查通讯录

    一.通讯录应用介绍 通讯录应用是Android自带的应用程序,我们看到此应用的时候,可能只认为这是一个应用,用数据库存储数据,但是实际上不是这样的. 通讯录是ContentProvider的应用,通讯 ...

  5. ASP.NET 创建网站地图

    很多个人站长会使用工具来生成自己网站的站点地图,这样做的缺点在于网站的 sitemap 不能及时的得到更新.当我们发表了一篇新文章时,应该对网站的地图进行更新,并通知搜索引擎网站地图已经发生了改变! ...

  6. Block的copy和循环引用的问题

    在实际开发中,发现使用Block有着比delegate和notification更简洁的优势.于是在目前的项目中大量的使用block. 在我的头文件我是这样声明使用block的. 我将block声明为 ...

  7. jQuery.cookie

    了解cookie先了解一下知识点: Navigator (一般是浏览器)对象包含有关浏览器的信息. Navigator userAgent:是一个只读字符串,声明了浏览器用于HTTP请求的用户代理头的 ...

  8. 加密算法—MD5、RSA、DES

    最近因为要做一个加密的功能,简单了解了一下加密算法,现在比较常用的有三个加密算法MD5加密算法.RSA加密算法.DES加密算法.       MD5加密算法     定义:MD5算法是将任意长度的“字 ...

  9. echo 换行不换行

    echo换行输出需要转义符 -e 看以下例子: echo -e "It is the first line." >> a; echo -e "It is th ...

  10. 20145225 《Java程序设计》第2周学习总结

    20145225<Java程序设计> 第2周学习总结 教材学习内容总结 3.1.1Java的类型 分为基本类型(Primitive type)和类类型(Class type) 基本类型: ...