




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Unicode下CString与char *转换在Visual C+.NET2005中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多字节字符集(MBCS:Multi-Byte Character Set),这样导致在VC6.0中非常简单实用的各类字符操作和函数在VS2005环境下运行时会报各种各样的错误,这里总结了在Visual C+.NET2005环境中Unicode字符集下CString和char *之间相互转换的几种方法,其实也就是Unicode字符集与MBCS字符集转换。 (1)、Unicode下CString转换为char *方法一:使用API:WideCharToMultiByte进行转换 CString str = _T(D:校内项目QQ.bmp); /注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的 int n = str.GetLength(); / n = 14, len = 18 /获取宽字节字符的大小,大小是按字节计算的 int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL); /为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小 char * pFileName = new charlen+1; /以字节为单位 /宽字节编码转换成多字节编码 WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL); pFileNamelen+1 = 0; /多字节字符以0结束方法二:使用函数:T2A、W2A CString str = _T(D:校内项目QQ.bmp); /声明标识符 USES_CONVERSION; /调用函数,T2A和W2A均支持ATL和MFC中的字符转换 char * pFileName = T2A(str); /char * pFileName = W2A(str); /也可实现转换 注意:有时候可能还需要添加引用#include (2)、Unicode下char *转换为CString方法一:使用API:MultiByteToWideChar进行转换 char * pFileName = D:校内项目QQ.bmp; /计算char *数组大小,以字节为单位,一个汉字占两个字节 int charLen = strlen(pFileName); /计算多字节字符的大小,按字符计算。 int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,0); /为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小 TCHAR *buf = new TCHARlen + 1; /多字节编码转换成宽字节编码 MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len); buflen = 0; /添加字符串结尾,注意不是len+1 /将TCHAR数组转换为CString CString pWideChar; pWideChar.Append(buf); /删除缓冲区 delete buf;方法二:使用函数:A2T、A2W char * pFileName = D:校内项目QQ.bmp; USES_CONVERSION; CString s = A2T(pFileName); /CString s = A2W(pFileName);方法三:使用_T宏,将字符串转换为宽字符 /多字节字符集,在vc6和vc7种可以编译通过的语句,但VS2005不能通过,默认为Unicode字符集 /AfxMessageBox(加载数据失败,0); /书写代码使用TEXT()或_T(),文本在UNICODE和非UNICODE程序里都通用 AfxMessageBox(_T(加载数据失败),0); 注意:直接转换在基于MBCS的工程可以,但在基于Unicode字符集的工程中直接转换是不可行的,CString会以Unicode的形式来保存数据,强制类型转换只会返回第一个字符。Unicode下CString转TCHARTCHAR* szMsg = new TCHARwcslen(strAdbCmd); szMsg = strAdbCmd.GetBuffer(strAdbCmd.GetLength();strAdbCmd.ReleaseBuffer();用完了别忘了delete szMsg;CString转 char* char * charP; CString strP; WideCharToMultiByte(CP_OEMCP,0,(LPCTSTR)strP,-1,charP,260,0,false);char* TCHAR*转 CString char cstr20=”sdaww”; TCHAR tcstr20=_T(”unicode”); CString str=CString(cstr); CString str1=CString(tcstr); CString转 int CString strNum=_T(“”); int value = _ttoi(static_cast(strNum); 或者 int value = _ttoi(strNum);int 转CString int ia=1232; CString stri= stri.Format(_T(“%d”),ia);多字节字符集下Cstring转化为char转化成数组:Cstring str=”convert”;char char_str 512;strncpy_s(char_str,(LPCTSTR)str_sum,sizeof(char_str); 转化成char指针:char * ch_a =(char*)str.GetBuffer(str.GetLength(); char转化为Cstring Cstring str;char szBuff2048;str.Format(%s,szBuff);CString 转 int :n=atoi(str);文介绍如何在VC资源文件中加入自己的声音资源,使自己的应用程序可以播放声音。1,首先用文本编辑器(如记事本)打开资源文件(.rc文件)在最后加入自己的声音资源,如下IDW WAVE c:kavsoundvirus.wav保存资源文件。2,在应用程序中要播放声音的地方启动另一线程,用来播放声音AfxBeginThread(AFX_THREADPROC)sound,NULL,THREAD_PRIORITY_NORMAL);3,添加线程回调函数这里介绍加载资源的方法。首先用函数AfxGetInstanceHandle()获得实例的句柄,其次用函数FindResource找到自己的声音资源。HRSRC FindResource(HMODULE hModule, / module handleLPCTSTR lpName,/ resource nameLPCTSTR lpType / resource type)找到声音资源后,要用LoadResource加入该资源HGLOBAL LoadResource(HMODULE hModule, / module handleHRSRC hResInfo / resource handle);最后锁定资源内存块,并返回所标定内存块的虚拟内存地址。如果该资源被成功锁定的话,则返回值指向该资源开始处的第一个字节:LPVOID pv=LockResource()注意:若上述四步中的任何一步发生问题,则返回并释放相应的内存。接下去要做的事情就是根据文件数据类型进行数据加载。UINT CPlaySoundView:sound(LPVOID pParam)HINSTANCE h=AfxGetInstanceHandle();HRSRC hr=FindResource(h,IDW,WAVE);HGLOBAL hg=LoadResource(h,hr);LPSTR lp=(LPSTR)LockResource(hg);sndPlaySound(lp,SND_MEMORY|SND_SYNC);FreeResource(hg);return 0;播放声音文件的高级方法作者: wei 发表日期: 2007-12-25 复制链接 收藏 本文介绍如何在VC资源文件中加入自己的声音资源,使自己的应用程序可以播放声音。1、首先用文本编辑器(如记事本)打开资源文件(.rc文件)在最后加入自己的声音资源,如下IDW WAVE c:kavsoundvirus.wavsize=5/size保存资源文件。 2、在应用程序中要播放声音的地方启动另一线程,用来播放声音:AfxBeginThread(AFX_THREADPROC)sound,NULL,THREAD_PRIORITY_NORMAL);3、添加线程回调函数这里介绍加载资源的方法。首先用函数AfxGetInstanceHandle()获得实例的句柄,其次用函数FindResource找到自己的声音资源。HRSRC FindResource(HMODULE hModule, / module handleLPCTSTR lpName, / resource nameLPCTSTR lpType / resource type)找到声音资源后,要用LoadResource加入该资源HGLOBAL LoadResource(HMODULE hModule, / module handleHRSRC hResInfo / resource handle);最后锁定资源内存块,并返回所标定内存块的虚拟内存地址。如果该资源被成功锁定的话,则返回值指向该资源开始处的第一个字节:LPVOID pv=LockResource() 注意:若上述四步中的任何一步发生问题,则返回并释放相应的内存。接下去要做的事情就是根据文件数据类型进行数据加载。 UINT CPlaySoundView:sound(LPVOID pParam)HINSTANCE h=AfxGetInstanceHandle();HRSRC hr=FindResource(h,IDW,WAVE);HGLOBAL hg=LoadResource(h,hr);LPSTR lp=(LPSTR)LockResource(hg);sndPlaySound(lp,SND_MEMORY|SND_SYNC);FreeResource(hg);return 0;在Visual C+资源文件中加入声音资源 tags: visual 资源 文件 中加 加入 入声 声音 本文介绍如何在VC资源文件中加入自己的声音资源,使自己的应用程序可以播放声音。1、首先用文本编辑器(如记事本)打开资源文件(.rc文件)在最后加入自己的声音资源,如下IDW WAVE c:kavsoundvirus.wav保存资源文件。 2、在应用程序中要播放声音的地方启动另一线程,用来播放声音:AfxBeginThread(AFX_THREADPROC)sound,NULL,THREAD_PRIORITY_NORMAL);3、添加线程回调函数这里介绍加载资源的方法。首先用函数AfxGetInstanceHandle()获得实例的句柄,其次用函数FindResource找到自己的声音资源。HRSRC FindResource(HMODULE hModule, / module handleLPCTSTR lpName, / resource nameLPCTSTR lpType / resource type)找到声音资源后,要用LoadResource加入该资源HGLOBAL LoadResource(HMODULE hModule, / module handleHRSRC hResInfo / resource handle);最后锁定资源内存块,并返回所标定内存块的虚拟内存地址。如果该资源被成功锁定的话,则返回值指向该资源开始处的第一个字节:LPVOID pv=LockResource() 注意:若上述四步中的任何一步发生问题,则返回并释放相应的内存。接下去要做的事情就是根据文件数据类型进行数据加载。 UINT CPlaySoundView:sound(LPVOID pParam)HINSTANCE h=AfxGetInstanceHandle();HRSRC hr=FindResource(h,IDW,WAVE);HGLOBAL hg=LoadResource(h,hr);LPSTR lp=(LPSTR)LockResource(hg);sndPlaySound(lp,SND_MEMORY|SND_SYNC);FreeResource(hg);return 0;本文介绍如何在VC资源文件中加入自己的声音资源,使自己的应用程序可以播放声音。首先用函数AfxGetInstanceHandle()获得实例的句柄,其次用函数FindResource找到自己的声音资源。HRSRC FindResource( HMODULE hModule, / module handle LPCTSTR lpName, / resource name LPCTSTR lpType / resource type) 找到声音资源后,要用LoadResource加入该资源HGLOBAL LoadResource(HMODULE hModule, / module handleHRSRC hResInfo / resource handle);最后锁定资源内存块,并返回所标定内存块的虚拟内存地址。 VC+中播放声音的方法声音是多媒体的一个重要组成部分,在应用程序中加入声音可以使界面更友好。在VC+中可以根据不同的应用要求,用不同的方法实现声音的播放。一播放声音文件的简单方法在VC+ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用VC+中提供的声音播放函数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中参数lpszSound是需要播放声音的.WAV文件的路径和文件名, hmod在这里为NULL,fuSound是播放声音的标志,详细说明请参考VC+中的帮助。 例如播放C:soundmusic.wav可以用sndPlaySound (c:soundmusic.wav,SND_ASYNC);或PlaySound(c:soundmusic.wav,NULL, SND_ASYNC|SND_NODEFAULT );如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。二将声音文件加入到程序中在VC+的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。同时VC+也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现无.WAV文件的声音播放。要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。假设生成的声音文件资源标识符为IDR_WAVE1。在播放时只需要调用下面的语句:PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(), SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄,SND_RESOURCE是必须的标志。作为资源的声音文件的第二种播放方法是把资源读入内存后作为内存数据播放。具体步骤入下:1获得包含资源的模块句柄:HMODULE hmod=AfxGetResourceHandle(); 2检索资源块信息:HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T(WAVE);3. 装载资源数据并加锁:HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource);LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem);4播放声音文件:sndPlaySound(lpMemSound,SND_MEMORY);5释放资源句柄:FreeResource(hGlobalMem); 三播放声音文件的高级方法在VC+中提供了一组对音频设备及多媒体文件直接进行操作的函数。利用这些函数可以灵活地对声音文件进行各种处理。首先介绍几个要用到的数据结构。WAVEFORMATEX结构定义了WAVE音频数据文件的格式。WAVEHDR结构定义了波形音频缓冲区。读出的数据首先要填充此缓冲区才能送音频设备播放。WAVEOUTCAPS结构描述了音频设备的性能。MMCKINFO结构包含了RIFF文件中一个块的信息。详细的说明请参考VC+中的帮助。下面给出程序流程简图及程序源代码清单,在VC+环境下可直接使用:源程序清单如下:LPSTR szFileName;/声音文件名MMCKINFO mmckinfoParent;MMCKINFO mmckinfoSubChunk;DWORD dwFmtSize;HMMIO m_hmmio;/音频文件句柄DWORD m_WaveLong;HPSTR lpData;/音频数据HANDLE m_hData;HANDLE m_hFormat;WAVEFORMATEX * lpFormat;DWORD m_dwDataOffset;DWORD m_dwDataSize;WAVEHDR pWaveOutHdr;WAVEOUTCAPS pwoc;HWAVEOUT hWaveOut;/打开波形文件if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF)/File open ErrorError(Failed to open the file.);/错误处理函数return false;/检查打开文件是否是声音文件mmckinfoParent.fccType =mmioFOURCC(W,A,V,E);if(mmioDescend(m_hmmio,(LPMMCKINFO)&mmckinfoParent,NULL,MMIO_FINDRIFF)/NOT WAVE FILE AND QUIT/寻找 fmt 块mmckinfoSubChunk.ckid =mmioFOURCC(f,m,t, );if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK)/Cant find fmt chunk/获得 fmt 块的大小,申请内存dwFmtSize=mmckinfoSubChunk.cksize ;m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize);if(!m_hFormat)/failed alloc memorylpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat);if(!lpFormat)/failed to lock the memoryif(unsigned long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize)/failed to read format chunk/离开 fmt 块mmioAscend(m_hmmio,&mmckinfoSubChunk,0);/寻找 data 块mmckinfoSubChunk.ckid=mmioFOURCC(d,a,t,a);if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK)/Cant find data chunk/获得 data块的大小m_dwDataSize=mmckinfoSubChunk.cksize ;m_dwDataOffset =mmckinfoSubChunk.dwDataOffset ;if(m_dwDataSize=0L)/no data in the data chunk/为音频数据分配内存lpData=new charm_dwDataSize;if(!lpData)/faileif(mmioSeek(m_hmmio,SoundOffset,SEEK_SET)0)/Failed to read the data chunkm_WaveLong=mmioRead(m_hmmio,lpData,SoundLong);if(m_WaveLong0)/Failed to read the data chunk/检查音频设备,返回音频输出设备的性能if(waveOutGetDeVCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS)!=0)/Unable to allocate or lock memory/检查音频输出设备是否能播放指定的音频文件if(waveOutOpen(&hWaveOut,DevsNum,lpFormat,NULL,NULL,CALLBACK_NULL)!=0)/Failed to OPEN the wave out devices/准备待播放的数据pWaveOutHdr.lpData =(HPSTR)lpData;pWaveOutHdr.dwBufferLength =m_WaveLong;pWaveOutHdr.dwFlags =0;if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR)!=0)/Failed to prepare the wave data buffer/播放音频数据文件if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR)!=0)/Failed to write the wave data buffer/关闭音频输出设备,释放内存waveOutReset(hWaveOut);waveOutClose(hWaveOut);LocalUnlock(m_hFormat);LocalFree(m_hFormat);delete lpData; 说明:1)以上使用的音频设备和声音文件操作函数的声明包含在mmsystem.h头文件中,因此在程序中必须用#include mmsystem.h语句加入头文件。同时在编译时要加入动态连接导入库winmm.lib,具体实现方法是从Developer Studio的Project菜单中选择Settings,然后在Link选项卡上的Object/Library Modules控制中加入winmm.lib。2)在pWaveOutHdr.lpData中指定不同的数据,可以播放音频数据文件中任意指定位置的声音。3) 以上程序均在VC+6.0中调试通过,在文中省略了对错误及异常情况的处理,在实际应用中必须加入。四结论在VC+中可以根据应用需要采用不同的方法播放声音文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 货车检车员技术考核试卷及答案
- 宴会定制服务师综合考核试卷及答案
- 竖井钻机工成本预算考核试卷及答案
- 石膏煅烧熟化工艺改进工艺考核试卷及答案
- 露天采矿单斗铲司机主管竞选考核试卷及答案
- 2024新版2025秋青岛版六三制三年级数学上册教学课件:第3单元 谁的眼睛亮-观察物体(一)
- 信息技术试题及答案语文
- 印刷机械公司合同付款管理办法
- 银行总行笔试题库及答案
- 银行账户试题及答案
- 2025年脚手架租赁合同3篇
- 2025年下半年安徽省港航集团有限公司所属企业社会公开招聘22名考试参考试题及答案解析
- 人教PEP版六年级英语上册全册教案
- 3D打印技术在制造业2025年发展趋势及市场前景可行性分析报告
- 综合楼玻璃安装合同协议书范本模板6篇
- 2025年度企事业单位办公家具采购合同
- 2025年度集中供暖项目暖气设施安装及售后服务合同
- 护士医护人员职业安全防护培训
- 2025福建厦门市公安局同安分局招聘警务辅助人员50人笔试备考试题及答案解析
- 巴彦淖尔教师招考试题及答案
- 2025年四川省建筑安全员A证模拟试题(及答案)
评论
0/150
提交评论