?? 第1小節(jié).txt
字號:
傻馬亂踢 編譯
游戲編程起源(初學(xué)者)Ⅰ
★第一章 Windows編程基礎(chǔ)
☆ 簡介
本章目的是介紹WINDOWS編程基礎(chǔ)。在本章結(jié)束時,你應(yīng)該能夠很好的工作了,雖燃可能是簡單的WINDOWS程序。你需要有C語言的基礎(chǔ)知識,我很少將C++的代碼擴(kuò)充到程序中。當(dāng)然,由于WINDOWS本身就是面向?qū)ο蟮?,一點(diǎn)類的知識是不會對你有什么損害的。如果你不熟悉C++,沒有關(guān)系,我想你還是能從我這里學(xué)到大部分的東西。所有的程序代碼都通過了MICROSOFT VISUAL C++6.0的編譯,如果你還沒有合適的編譯器,弄一個同我一樣的好了,它還是很棒的。開動吧!
☆ 開始
多數(shù)的Windows程序都需要Windows.h和Windowsx.h這兩個頭文件,要確保使用它們。當(dāng)然,你還需要其它的標(biāo)準(zhǔn)的C的頭文件,象stdio.h,conio.h等。除了這些,你還會經(jīng)??吹皆诔绦虻拈_始有這樣一行代碼:
#define WIN32_LEANAND_MEAN
它表示W(wǎng)indows的頭文件中將拒絕接受MFC的東西,這將加速你的build時間。如果你從沒有打算應(yīng)用MFC在你的游戲編程中,那就使用它吧。如果你以前從沒有看過這種聲明類型——在#define后,直接加上一個“單詞”,那么它的作用就是有條件編譯??纯聪旅娴睦樱?
#ifdef DEBUG_MODE
printf("Debug mode is active!");
#endif
意思是:如果程序的開始包含#define DEBUG_MODE,那么就printf(),否則退出。這個對于你跟蹤程序的邏輯錯誤是很有幫助的。
☆ WinMain()函數(shù)
DOS下的C語言從main()開始,Windows下的C語言從WinMain()開始,一個空的WinMain()函數(shù)是這樣的:
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
return(0);
}
一個函數(shù)即使什么也沒做,也應(yīng)該返回一個值。是的,有好多東西我們不熟悉。首先的首先,WINAPI是個什么聲明?WINAPI是在windows.h頭文件中定義的一個宏,它把函數(shù)調(diào)用翻譯成正確的調(diào)用約定。當(dāng)我們在程序中需要用到匯編語言的時候,我們在來深究它好了,記住,如果要用WinMain(),就必須要有WINAPI。
下一步讓我們來看看括號里的四個參數(shù):
◎ HINSTANCE hinstance:HINSTANCE是一個句柄類型的標(biāo)識符。變量hinstance是一個整數(shù),用于標(biāo)識程序?qū)嵗indows設(shè)置這個參數(shù)的值,并把它傳遞給你的程序代碼。很多Windows函數(shù)都要用到它。
◎ HINSTANCE hPreInstance:你不用擔(dān)心這個參數(shù),它已經(jīng)被廢掉了。它只是為古老的Windows版本服務(wù)的。你將還會看到類似的情況。
◎ LPSTR lpCmdLine:是一個指向字符串的指針,它僅在程序名是從DOS命令行輸入或是從Run對話框中輸入時才起作用。因此,很少被程序代碼所用。
◎ int nCmdShow:決定了窗口在初始顯示時的狀態(tài)。Windows通常給這個參數(shù)分配一個值。通常是SW_打頭的一個常量。例如SW_SHOWNORMAL表示默認(rèn)狀態(tài),SW_MAXIMIZE或SW_MINIMIZE分別表示最大和最小模式等等。
以上大體上是WinMain()的參數(shù)的介紹。下面對變量、參數(shù)、常量、類等的命名方法介紹一下。
☆ 匈牙利命名法
【不翻譯這一段了,相關(guān)的資料很多】
☆ 消息
當(dāng)你在DOS下編程的時候,你不必?fù)?dān)心其它程序的運(yùn)行,因?yàn)镈OS是獨(dú)占模式。但你在Windows平臺上編程時,你不得不考慮其它正在運(yùn)行的程序。鑒于此,Windows通過“消息”來連接操作申請和具體操作。簡單的說,就是我們指示程序或程序本身向Windows發(fā)出諸如移動窗口、放大窗口、關(guān)閉窗口等地申請,Windows再根據(jù)申請,考察實(shí)地情況,拒絕或發(fā)出指令,讓程序(計算機(jī))作出相應(yīng)的動作。再例如,鼠標(biāo)隨時向Windows發(fā)出消息,匯報光標(biāo)位置,左鍵或右鍵是否按下等,Windows再根據(jù)消息作出相應(yīng)的反應(yīng)??傊瑹o論何時,Windows都要隨時掌控所有的消息,而且,Windows是一直不斷地接收到各種消息。
這種功能是通過一種被命名為CALLBACK函數(shù)類型實(shí)現(xiàn)的。不用害怕,消息的傳遞來,傳遞去都是由Windows自己完成的,你只要聲明一個CALLBACK函數(shù)就可以了,就像WINAPI用在WinMain()前一樣。如果還沒有明白,不要緊,往下看你就明白了?,F(xiàn)在,我要離開這個話題一會,因?yàn)槟阒挥邢冉⒋翱冢╓indows),傳遞消息才有可能實(shí)現(xiàn)。
☆ 窗口類
現(xiàn)在談?wù)撘稽c(diǎn)C++的知識,因?yàn)橐虢⒁粋€窗口,你就得先建立一個窗口類。窗口類包含所有的有關(guān)窗口的信息,如用什么樣的鼠標(biāo)符號,菜單樣式等等。開發(fā)任何一個窗口程序,都離不開窗口類的建立。為了達(dá)到此目的,你必須填寫WNDCLASSEX結(jié)構(gòu)。EX的意思是“擴(kuò)充”的意思,因?yàn)橛幸粋€老的結(jié)構(gòu)叫作WNDCLASS,這里,我們將使用WNDCLASSEX結(jié)構(gòu),它的樣子如下:
typedef struct _WNDCLASSEX {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX;
這個結(jié)構(gòu)有不少成員,討厭的是,你必須為窗口類設(shè)置每一個成員。莫發(fā)愁,紙老虎一個。讓我們來個速成。
※ UINT cbSize:指定了以字節(jié)為單位的結(jié)構(gòu)的大小。這個成員是通過sizeof(WNDCLASSEX)實(shí)現(xiàn)的。你將會經(jīng)??吹剿?,尤其是你使用了DirectX。
※ UINT style:指定了窗口的風(fēng)格。它經(jīng)常被以CS_打頭的符號常量定義。兩種或兩種以上的風(fēng)格可以通過C語言中的“或”(|)運(yùn)算符加以組合。大多數(shù)情況我們只應(yīng)用四種風(fēng)格,出于對文章長度的考慮,我們只列出這四種。若你還需要其它的,到MSDN里找一下好了。別告訴我你用的不是Visual C++??!
◎ CS_HREDRAW:一旦移動或尺寸調(diào)整使客戶區(qū)的寬度發(fā)生變化,就重新繪制窗口。
◎ CS_VREDRAW:一旦移動或尺寸調(diào)整使客戶區(qū)的高度發(fā)生變化,就重新繪制窗口。
◎ CS_OWNDC:為該類中的每一個窗口分配一個唯一的設(shè)備上下文。
◎ CS_DBLCLKS:當(dāng)用戶雙擊鼠標(biāo)時向窗口過程發(fā)送雙擊消息。
※ WNDPROC lpfnWndProc:是指向窗口過程的指針。一般都指向CALLBACK函數(shù)。如果你沒有用過函數(shù)指針,簡單理解為函數(shù)的地址就是函數(shù)的名字,名字后面別帶括號。
※ int cbClsExtra:它是為類保留的額外信息 。大多數(shù)程序員不用它,你在在寫游戲程序時也不太可能用它,所以,設(shè)為0好了。
※ int cbWndExtra:同上一個差不多,設(shè)為0好了。
※ HANDLE hInstance:是指向窗口過程實(shí)例的句柄。同時也是WinMain()函數(shù)的參數(shù)之一。應(yīng)該設(shè)置為hinstance。
※ HICON hIcon:指向窗口圖標(biāo)的句柄,它通常被LoadIcon()函數(shù)設(shè)置。在你學(xué)會如何在你的程序中使用資源前,你先設(shè)置成如下樣子:LoadIcon(NULL,IDI_WINLOGO)。當(dāng)然,還有一些其它的IDI_打頭的符號常量,你自己去幫助文件里找吧。
※ HCURSOR hCursor:指向窗口光標(biāo)的句柄,它通常被LoadCursor()函數(shù)設(shè)置,在你學(xué)會如何在你的程序中使用資源前,你先用Windows默認(rèn)的吧,LoadCursor(NULL,IDC_ARROW)。
※ HBRUSH hbrBackground:當(dāng)你的窗口過程得到消息,要求刷新(或重畫)窗口時,至少要用一種純色或“brush”(畫刷)重畫窗口區(qū)域,畫刷是由參數(shù)確定的。你可以使用GetStockObject()函數(shù)調(diào)用幾種常備的畫刷,如BLACK_BRUSH, WHITE_BRUSH, GRAY_BRUSH等?,F(xiàn)在,你就用GetStockObject(BLACK_BRUSH)吧。對不起,你可能覺得我說的太簡單了,但我不想把開始弄得太復(fù)雜。我在以后的篇幅里會詳細(xì)講的,我保證。
※ LPCTSTR lpszMenuName:如果你想建立一個有下拉菜單的窗口,你得給這個參數(shù)賦一個菜單名稱(這涉及到資源),由于你還不知道怎么創(chuàng)建菜單,你就先用NULL設(shè)置成一個沒有菜單的窗口吧。
※ LPCSTR lpszClassName:很顯然,你需要給類起個名字,隨你便,如“TMD”。要用雙引號引上??!
※ HICON hIconSm:指向小圖標(biāo)的句柄。小圖標(biāo)用來顯示在窗口的標(biāo)題欄里。要用到LoadIcon()函數(shù),現(xiàn)在,你就用Windows默認(rèn)的吧,LoadIcon(NULL,IDI_WINLOGO)。
好了,你關(guān)于WNDCLASSEX結(jié)構(gòu)知道的差不多了,你可以自己設(shè)置它了。下面是一個例子:
WNDCLASSEX sampleClass; // declare structure variable
sampleClass.cbSize = sizeof(WNDCLASSEX); // always use this!
sampleClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; // standard settings
sampleClass.lpfnWndProc = MsgHandler; // we need to write this!
sampleClass.cbClsExtra = 0; // extra class info, not used
sampleClass.cbWndExtra = 0; // extra window info, not used
sampleClass.hInstance = hinstance; // parameter passed to WinMain()
sampleClass.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Windows logo
sampleClass.hCursor = LoadCursor(NULL, IDC_ARROW); // standard cursor
sampleClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // a simple black brush
sampleClass.lpszMenuName = NULL; // no menu
sampleClass.lpszClassName = "Sample Class" // class name
sampleClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // Windows logo again
【“//”后面的我就不翻譯了】
我想,你已經(jīng)有點(diǎn)兒不太崇拜Windows程序員了。言歸正傳,有一點(diǎn)我得提醒你,注意函數(shù)GetStockObject()前的(HBRUSH)類型配置,這是因?yàn)镚etStockObject()可以調(diào)用其它的對象,不僅僅是“brush”,所以你需要一個HBRUSH類型配置。在Visual C++舊版本里不用配置,但新的6.0版本需要它,否則會編譯出錯。
下一件事是注冊這個窗口類,只有這樣,你才能創(chuàng)建新的窗口。十分簡單,你只需要調(diào)用一個RegisterClassEX()函數(shù),它只有一個參數(shù),就是你的窗口類的地址(名字),根據(jù)我上面給的例子,這里應(yīng)該這樣:
RegisterClassEx(&sampleClass);
嗨,我們的窗口類創(chuàng)建完了,我們可以用它創(chuàng)建一個窗口了。只是時間問題嘍!
☆ 創(chuàng)建窗口
待續(xù)。。。。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -