vc++

VC++的安裝

作為visual studio的一個組件,可以通過安裝visual studio來獲得
VC作為一個主流的開發平台一直深受編程愛好者的喜愛,但是很多人卻對它的入門感到難於上青天,究其原因主要是大家對他錯誤的認識造成的,嚴格的來說VC++不是門語言,雖然它和C++之間有密切的關係,如果形象點比喻的話,可以把C++看作為一種“工業標準”,而VC++則是某種作業系統平台下的“廠商標準”,而“廠商標準”是在遵循“工業標準”的前提下擴展而來的。
VC++應用程式的開發主要有兩種模式,一種是WIN API方式,另一種則是MFC方式,傳統的WIN API開發方式比較繁瑣,而MFC則是對WIN API再次封裝,所以MFC相對於WIN API開發更具備效率優勢,但為了對WINDOWS開發有一個較為全面細緻的認識,筆者在這裡還是以講解WIN API的相關內容為主線。
話說到這裡可能更多人關心的是學習VC++需要具備什麼條件,為什麼對於這扇門屢攻不破呢?
要想學習好VC必須具備良好的C/C++的基礎,必要的英語閱讀能力也是必不可少的,因為大量的技術文檔多以英文形式發布。
VC基於C,C++語言,主要由是MFC組成,是與系統聯繫非常緊密的編程工具,它兼有高級,和低級語言的雙重性,功能強大,靈活,執行效率高,幾乎可說VC在 Windows平台無所不能。 最大缺點是開發效率不高。

VC適用範圍

1、 VC主要是針對Windows系統,適合一些系統級的開發,可以方便實現一些底層 的調用。在VC裡邊嵌入彙編語言很簡單。
2、 VC主要用在驅動程式開發
3、 VC執行效率高,當對系統性能要求很高的時候,可用VC開發。
4、 VC主要適用於遊戲開發
5、 VC多用於單片機,工業控制等軟體開發,如直接對I/O地址操作,就要用C++。
6、 VC適用開發高效,短小,輕量級的COM組件,DLL。比如WEB上的控制項。
7、 VC可以開發優秀的基於通信的程式。
8、 VC可以開發高效靈活的檔案操作程式。
9、 VC可以開發靈活高效的資料庫操作程式。
10、 VC是編CAD軟體的唯一選擇!!!包括AUTOCAD,UG的二次開發。
11、VC在多執行緒、網路通信、分布套用方面,VC++有不可比擬的優勢。

VC++技術介紹

匈牙利命名法規則
一般情況下,變數的取名方式為:
範圍前綴_,類型前綴_,限定詞。
特殊的類型命名,前綴表示:
類、接口
前綴 類型 例子 備註
Lm Class LmObject 表示類型本身不與範圍前綴結合使用
I Interface 接口 IUnknown
註:類名前綴改為Lm,對於非全局的類最好有語義表示其所屬模組。類的實例命名與類名大致相同,只是類名語義表示類的通用含義,而類名表示此實例的具體語義。如類名LmSketPoint表示草圖點的類定義,而它的兩個實例 _StartPoint,_EndPoint分別代表起點和終點的語義。類的實例命名帶上前綴_。
特殊約定:
a. MouseTool的派生類的前綴為_Mt.
b. 對話框類的前綴為CDlg.
c. 橡皮條類的前綴為_Rb.
範圍前綴:
前綴 類型 例子 備註
g_ 全局作用域 g_Servers
m_ 成員變數 m_pDoc,
l_ 局部作用域 l_strName 少用
註:編程時儘量少用全程變數,對於全程變數還應在類型前綴後加上如下關鍵字:
特徵模組 : Fea
草圖模組 : Sket
裝配模組 : Asm
工程圖模組 : Lay
曲面模組 : Surf
界面模組 : Ui
常用的一般數據類型的前綴
前綴 類型 記憶體規格描述 例子
ch char 8-bit character chGrade
ch TCHAR 16-bit character if _UNICODE is defined chName
b BOOL Boolean value bEnabled
n int Integer (size dependent on operating system) nLength
n UINT Unsigned value (size dependent on operating system) nLength
w WORD 16-bit unsigned value wPos
l LONG 32-bit signed integer lOffset
dw DWORD 32-bit unsigned integer dwRange
p * Ambient memory model pointer pDoc
lp FAR* Far pointer lpDoc
lpsz LPSTR 32-bit pointer to character string lpszName
lpsz LPCSTR 32-bit pointer to constant character string lpszName
lpsz LPCTSTR 32-bit pointer to constant character string if _UNICODE is defined lpszName
h handle Handle to Windows object hWnd
lpfn (*fn)() callbackFar pointer to CALLBACK function lpfnAbort
常用Windows對象名稱縮寫
Windows 對象 例子變數 MFC類 例子對象
HWND hWnd; CWnd* pWnd;
HDLG hDlg; CDialog* pDlg;
HDC hDC; CDC* pDC;
HGDIOBJ hGdiObj; CGdiObject* pGdiObj;
HPEN hPen; CPen* pPen;
HBRUSH hBrush; CBrush* pBrush;
HFONT hFont; CFont* pFont;
HBITMAP hBitmap; CBitmap* pBitmap;
HPALETTE hPalette; CPalette* pPalette;
HRGN hRgn; CRgn* pRgn;
HMENU hMenu; CMenu* pMenu;
HWND hCtl; CStatic* pStatic;
HWND hCtl; CButton* pBtn;
HWND hCtl; CEdit* pEdit;
HWND hCtl; CListBox* pListBox;
HWND hCtl; CComboBox* pComboBox;
Visual C++常用宏定義命名列表
前綴 符號類型 符號例子 範圍
IDR_ 標識多個資源共享的類型 IDR_MAINFRAME 1 to 0x6FFF
IDD_ 對話框資源(Dialog) IDD_SPELL_CHECK 1 to 0x6FFF
IDB_ 點陣圖資源(Bitmap) IDB_COMPANY_LOGO 1 to 0x6FFF
IDC_ 游標資源(Cursor) IDC_PENCIL 1 to 0x6FFF
IDI_ 圖示資源(Icon) IDI_NOTEPAD 1 to 0x6FFF
ID_IDM_ 工具列或選單欄的命令項 ID_TOOLS_SPELLING 0x8000 to 0xDFFF
HID_ 命令上下文幫助(Command Help context) HID_TOOLS_SPELLING 0x18000 to 0x1DFFF
IDP_ 訊息框提示文字資源 IDP_INVALID_PARTNO 8 to 0xDFFF
HIDP_ 訊息框上下文幫助(Message-box Help context) HIDP_INVALID_PARTNO 0x30008 to 0x3DFFF
IDS_ 字元串資源(String) IDS_COPYRIGHT 1 to 0x7FFF
IDC_ 對話框內的控制資源(Control) IDC_RECALC 8 to 0xDFFF
VISUAL C++ 下的數據類型
類型 含義
ATOM Atom. For more information, see Atoms.
BOOL Boolean variable (should be TRUE or FALSE).
BOOLEAN Boolean variable (should be TRUE or FALSE).
BYTE Byte (8 bits).
CALLBACK Calling convention for callback functions.
CHAR 8-bit Windows (ANSI) character. For more information, see Character Sets Used By Fonts.
COLORREF Red, green, blue (RGB) color value (32 bits). See COLORREF for information on this type.
CONST Variable whose value is to remain constant during execution.
DWORD 32-bit unsigned integer.
DWORD_PTR Unsigned long type for pointer precision. Use when casting a pointer to a long type to perform pointer arithmetic. (Also commonly used for general 32-bit parameters that have been extended to 64 bits in 64-bit Windows. )
DWORD32 32-bit unsigned integer.
DWORD64 64-bit unsigned integer.
FLOAT Floating-point variable.
HACCEL Handle to an accelerator table.
HANDLE Handle to an object.
HBITMAP Handle to a bitmap.
HBRUSH Handle to a brush.
HCONV Handle to a dynamic data exchange (DDE) conversation.
HCONVLIST Handle to a DDE conversation list.
HCURSOR Handle to a cursor.
HDC Handle to a device context (DC).

VC++常用技術術語解釋

WINDOWS應用程式設計用到的基本術語:

視窗

視窗是windows應用程式的基本操作單元,用戶通過它與應用程式發生互動,例如輸入輸出操作等等,從程式的內部工作原來來看,每一個視窗對應一個訊息處理佇列,應用程式主要通過視窗訊息處理函式對用戶的輸入操作進行回響與處理。要想從程式設計師的角度充分理解視窗的含義,那么對WNDCLASS這個數據結構進行充分的了解是必須的。

實例

單個實例代表一個可執行程式在記憶體中的拷貝,如果一個應用程式執行許多次,那么在記憶體中就有多少個拷貝,也就可以說明有多少個實例存在。

句柄

句柄在windows環境下被定義成了一個無符號的整數,用於標識應用程式中不同的對象和同類對象中的不同實例。句柄可以看成是對象的編號,聯繫上面的實例,那么一個實例句柄就可以看作是單個應用程式在記憶體中拷貝的唯一身份編號,通常系統只能通過實例句柄去識別不同的應用程式,或者是相同應用程式的不同副本。

資源

Windows應用程式包含很多資源,例如,選單,圖示,對話框等等,VC++環境下我們不僅僅可以使用系統下原有的資源,我們也可以定義自己的資源,這些資源被定義在.RC檔案中,通過應用程式最後的編譯,這些資源檔案和程式代碼連線在一起,形成一個可執行的.EXE檔案或者是一個.DLL的庫檔案。在使用這些資源的時候,通過WIN API函式學將這些資源調用使用。

視窗訊息處理函式

視窗是人機互動的接口,當視窗接受到輸入請求的時候,就會把這一請求交給某一個函式進行處理,而這個函式就是視窗訊息處理函式,它能夠決定當一個訊息被接受到的時候採取什麼行動。
訊息通常是由一系列的輸入操作觸發的,比如當我按下滑鼠左鍵那么視窗訊息處理函式就會收到一個WM_LBUTTONDOWN的訊息信號。在視窗訊息處理函式中,我們可以利用switch和case結構進行控制, 針對此訊息作出我們想要的操作。

圖形設備接口

應用程式的任何輸出操作都需要通過圖形設備接口(GDI)中的函式來完成操作,GDI負責系統與用戶或繪圖程式之間的信息交換,並控制在輸出設備上顯示圖形或者文字,它將程式設計師與具體的硬體設備隔離開,讓程式設計師不需要考慮硬體設備操作的細節。

回調函式

回調函式是windows作業系統自己調用的函式,用戶是不能直接調用他們的。回調函式的定義必須嚴格的按照windows標準進行編寫。

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:\sound\music.wav",SND_ASYNC);或PlaySound("c:\sound\music.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 Error
Error("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))
{
//Can’t find ’fmt’ chunk
}
//獲得 ’fmt ’塊的大小,申請記憶體
dwFmtSize=mmckinfoSubChunk.cksize ;
m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize));
if(!m_hFormat)
{
//failed alloc memory
}
lpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat);
if(!lpFormat)
{
//failed to lock the memory
}
if((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))
{
//Can’t find ’data’ chunk
}
//獲得 ’data’塊的大小
m_dwDataSize=mmckinfoSubChunk.cksize ;
m_dwDataOffset =mmckinfoSubChunk.dwDataOffset ;
if(m_dwDataSize==0L)
{
//no data in the ’data’ chunk
}
//為音頻數據分配記憶體
lpData=new char[m_dwDataSize];
if(!lpData)
{
//faile
}
if(mmioSeek(m_hmmio,SoundOffset,SEEK_SET)<0)
{
//Failed to read the data chunk
}
m_WaveLong=mmioRead(m_hmmio,lpData,SoundLong);
if(m_WaveLong<0)
{
//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++中可以根據套用需要採用不同的方法播放聲音檔案。簡單套用可以直接調用聲音播放函式。第二種方法可以把聲音作為資源加入執行檔中。如果在播放之前要對聲音數據進行處理,可用第三種方法。
五.Visual C++.NET
隨著NET的時代來臨,VC++也如同VB一樣,脫胎換骨到VC++.NET

相關詞條

相關搜尋

熱門詞條

聯絡我們