zoukankan      html  css  js  c++  java
  • [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函数就只能播放一种音乐出现麻烦!

     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 = 0;      // 返回写入字节
    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[300];
    31     _stprintf_s(mcicmd, _T("open "%s" alias mymusic"),tmpwav);        // VC2008、VC2010 请用 _stprintf_s 函数
    32     mciSendString(mcicmd, NULL,0, NULL);
    33     // 播放音乐
    34     mciSendString(_T("play mymusic"), NULL, 0, NULL);
    35     // 停止播放并关闭音乐
    36     mciSendString(("stop mymusic"), NULL, 0, NULL);
    37     mciSendString(("close mymusic"), NULL, 0, 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, 0, NULL);//先关再开,注意顺序!!!
    52     mciSendString(mcicmd, NULL,0, NULL);
    53     mciSendString(_T("play mymusic"),NULL,0, NULL);        
    54 }//------------------------------------------------------------
  • 相关阅读:
    spring 声明式事务的坑 @Transactional 注解
    这样学Linux基本命令,事半功倍
    NIO buffer 缓冲区 API
    Java技术——你真的了解String类的intern()方法吗
    Spring中配置数据源的4种形式
    Java集合框架List,Map,Set等全面介绍
    阿里面试题:关于类中静态,非静态,构造方法的执行顺序
    web.xml加载顺序
    MyBatis 延迟加载,一级缓存,二级缓存设置
    mybatis 调用存储过程
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3577592.html
Copyright © 2011-2022 走看看