Vc++是Windows平臺上的c++編程環境。了解Windows平臺的很多特性,掌握MFC、ATL、COM的知識,學習VC很難。Windows下編程需要了解Windows的消息機制和回調函數的原理。MFC是Win32API的包裝類,需要了解文檔視圖類、窗口類、消息流向等結構。COM是代碼* * *的二進制標準,需要掌握它的基本原理等等。
VC作為主流的開發平臺,壹直深受編程愛好者的喜愛,但很多人覺得入門很難。主要原因是人們對VC++有壹個錯誤的理解。嚴格來說,VC++並不是壹門語言,雖然它和C++關系密切。如果形象地說,C++可以視為“工業標準”,而VC++則是“操作系統平臺”。
VC++應用開發主要有兩種模式,壹種是WIN API模式,壹種是MFC模式。傳統的WIN API開發模式比較復雜,而MFC是對WIN API的重新包裝,所以MFC比WIN API開發更有效率優勢。不過為了對WINDOWS開發有更全面詳細的了解,這裏筆者將重點講解WIN API的相關內容。
說到這裏,或許更多人關心的是,學習VC++需要什麽條件,為什麽這門固若金湯?
想要學好VC,必須要有很好的C/C++基礎,必要的英文閱讀能力也是必不可少的,因為大量的技術文檔大多是用英文發表的。本書主要從程序的內部運行機制和MFC程序的組織脈絡入手,讓讀者在學習VC++編程知識時既知其然,又知其所以然,從而幫助讀者從根本上理解和掌握Windows的編程。此外,書中還貫穿了作者多年學習編程的經驗和對學習方法的壹些建議,為讀者進壹步學習提供指導。
本書從實際應用入手,循序漸進地講述了Windows程序的內部運行機制、MFC框架、文本、菜單、對話框、文件操作、網絡編程、進程間通信、ActiveX控件、動態鏈接庫、鉤子編程等諸多主題。
本書內容豐富,實用性強,很多代碼可以直接應用到工程項目中。書中的光盤還免費提供了近45小時的VC++教學視頻,方便讀者在學習過程中相互參考,配合學習,更快更好地掌握VC++編程。
本書適合VC++ 6.0初學者和使用VC++從事開發的程序員,對有壹定VC++編程經驗的讀者有參考價值。VC++中播放聲音的方法編輯這個聲音是多媒體的重要組成部分。在應用程序中加入聲音可以使界面更加友好。在VC++中,可以根據不同的應用需求,以不同的方式播放聲音。
播放聲音文件的簡單方法
VC++中的多媒體動態鏈接庫提供了壹組與音頻設備相關的函數。這些功能可以用來方便的播放聲音。播放聲音最簡單的方法是直接調用VC++提供的聲音播放函數Boolsnd Playsound(LPCSTR LPSZ Sound,uint Fu Sound);或者boolplaysound (lpcstr lpszsound,hmodule hmod,dword fu sound);參數lpszSound是。需要播放聲音的WAV文件,hmod在這裏是NULL,fuSound是播放聲音的標誌。詳情請參考VC++中的幫助。比如玩C:soundmusic.wav可以用sndplaysound(" C:\ sound \ music . wav ",snd _ async);或者playsound ("c: \ sound \ music.wav ",null,snd _ async | snd _ nodefault);如果找不到music.wav文件,第壹種格式會播放系統默認聲音,第二種格式不會播放系統默認聲音。
2.向程序中添加聲音文件。
在VC++的編程中,我們可以使用各種標準資源,如位圖、菜單、對話框等。同時VC++還允許用戶自定義資源,所以我們可以將聲音文件作為用戶自定義資源添加到程序資源文件中,通過編譯連接生成EXE文件,實現聲音播放而無需。WAV文件。
要把聲音文件作為資源播放,首先要把要播放的聲音文件添加到資源管理器中(實現過程並不復雜,這裏就不描述了)。假設生成的聲音文件資源標識符是IDR_WAVE1。播放時,只需調用以下語句:
PlaySound(MAKEINTRESOURCE(IDR _ wave 1),AfxGetResourceHandle(),SND _ ASYNC | SND _ RESOURCE | SND _ NODEFAULT | SND _ LOOP);
MAKEINTRESOURCE()宏將整數資源標識符轉換為字符串,AfxGetResourceHandle()函數返回包含資源的模塊句柄。
SND_RESOURCE是必需的標誌。
將聲音文件作為資源播放的第二種方法是將資源讀入內存,並將它們作為內存數據播放。具體步驟如下:
1.獲取包含資源的模塊的句柄:
hm odule hmod = AfxGetResourceHandle();
2.檢索資源塊信息:
HR src hSndResource = find resource(hmod,MAKEINTRESOURCE(IDR _ WAVE 1),_ T(" WAVE "));
3.加載資源數據並鎖定它:
h global hGlobalMem = load resource(hmod,hsn resource);
LPCTSTR lpMemSound =(LPCSTR)lock resource(hGlobalMem);
4.播放聲音文件:
sndPlaySound(lpMemSound,SND _ MEMORY));
5.釋放資源句柄:
free resource(hGlobalMem);
3.播放聲音文件的高級方法
在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//音頻數據
處理m _ hData
處理m _ hFormat
WAVEFORMATEX * lpFormat
DWORD m _ dwDataOffset
DWORD m _ dwDataSize
WAVEHDR pWaveOutHdr
WAVEOUTCAPS pwoc
HWAVEOUT hWaveOut
//打開波形文件
如果(!(m _ hm mio = mmioupen(SZ filename,NULL,MMIO_READ|MMIO_ALLOCBUF)))
{
//文件打開錯誤
錯誤("無法打開文件。");//錯誤處理函數
返回false
}
//檢查打開的文件是否是聲音文件。
mmckinfoparent . fcctype = mmiosourcc(' W ',' A ',' V ',' E ');
if(mmodescend(m _ hm mio,(LPMMCKINFO)& amp;mmckinfoParent,NULL,MMIO_FINDRIFF))
{
//不波文件並退出
}
//找到“fmt”塊
mmckinfosubchunk . ckid = mmiosourcc(' f ',' m ',' ');
if(mmodescend(m _ hm mio,& ampmmckinfoSubChunk & amp;mmckinfoParent,MMIO_FINDCHUNK))
{
//找不到“fmt”塊
}
//獲取“fmt”塊的大小,並申請內存。
dwFmtSize = mmckinfosubchunk . CK size;
m _ h format = local alloc(LMEM _ MOVEABLE,LOWORD(dwFmtSize));
如果(!m_hFormat)
{
//失敗的分配內存
}
LP format =(WAVEFORMATEX *)local lock(m _ h format);
如果(!lpFormat)
{
//無法鎖定內存
}
if((無符號長整型)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize)
{
//無法讀取格式塊
}
//離開fmt塊
mmioAscend(m_hmmio,& ampmmckinfoSubChunk,0);
//找到“數據”塊
mmckinfosubchunk . ckid = mmiosourcc(' d ',' a ',' t ',' a ');
if(mmodescend(m _ hm mio,& ampmmckinfoSubChunk & amp;mmckinfoParent,MMIO_FINDCHUNK))
{
//找不到“數據”塊
}
//獲取“數據”塊的大小
m _ dwDataSize = mmckinfosubchunk . cksize;
m _ dwdata offset = mmckinfosubchunk . dwdata offset;
if(m_dwDataSize==0L)
{
//在“數據”區塊中沒有數據
}
//為音頻數據分配內存
LP data = new char[m _ dw datasize];
如果(!lpData)
{
//失敗
}
if(mmioSeek(m_hmmio,SoundOffset,SEEK _ SET)& lt;0)
{
//無法讀取數據塊
}
m_WaveLong=mmioRead(m_hmmio,lpData,sound long);
if(m _ wave long & lt;0)
{
//無法讀取數據塊
}
//檢查音頻設備,返回音頻輸出設備的性能。
if(waveOutGetDeVCaps(WAVE _ MAPPER,& amppwoc,sizeof(WAVEOUTCAPS))!=0)
{
//無法分配或鎖定內存
}
//檢查音頻輸出設備是否可以播放指定的音頻文件。
if(wave out open(& amp;hWaveOut,DevsNum,lpFormat,NULL,NULL,CALLBACK_NULL)!=0)
{
//無法打開波形輸出設備
}
//準備要播放的數據
pwaveouthdr . LP data =(HPSTR)LP data;
pwaveouthdr . dwbufferlength = m _ wavelength;
pwaveouthdr . dw flags = 0;
if(waveOutPrepareHeader(hWaveOut,& amppWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//無法準備波形數據緩沖區
}
//播放音頻數據文件
if(waveOutWrite(hWaveOut,& amppWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//無法寫入波形數據緩沖區
}
//關閉音頻輸出設備以釋放內存。
wave out reset(hWaveOut);
wave out close(hWaveOut);
local unlock(m _ h format);
local free(m _ h format);
刪除[]LP data;
註:1)上面用到的音頻設備和聲音文件操作函數的語句都包含在mmsystem.h頭文件中,所以在程序中頭文件必須加上# include“mm system . h”語句。同時編譯時要加入winmm.lib這個動態鏈接導入庫。具體實現方法是在Developer Studio的項目菜單中選擇設置,然後在鏈接選項卡上的對象/庫模塊控件中添加winmm.lib。2)在pWaveOutHdr.lpData中指定不同的數據,可以在音頻數據文件中的任意指定位置播放聲音。3)以上程序均已在VC++6.0中調試完畢,文中省略了對錯誤和異常情況的處理,實際應用中必須補充。
四。結論
在VC++中,可以根據應用需要使用不同的方法來播放聲音文件。簡單的應用程序可以直接調用聲音回放功能。第二種方法可以將聲音作為資源添加到可執行文件中。如果想在播放前對聲音數據進行處理,可以使用第三種方法。
動詞 (verb的縮寫)Visual C++。網
隨著. NET時代的到來,VC++轉變為VC++。NET就像VB壹樣。