国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

送給初學(xué)者的禮物:C++游戲編程起源連載一

2019-11-17 05:31:34
字體:
供稿:網(wǎng)友

  第一章 Windows編程基礎(chǔ)

簡介

本章目的是介紹WINDOWS編程基礎(chǔ)。在本章結(jié)束時,你應(yīng)該能夠很好的工作了,雖燃可能是簡單的WINDOWS程序。你需要有C語言的基礎(chǔ)知識,我很少將C++的代碼擴充到程序中。當(dāng)然,由于WINDOWS本身就是面向?qū)ο蟮模稽c類的知識是不會對你有什么損害的。假如你不熟悉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


意思是:假如程序的開始包含#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ū)嵗?。Windows設(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_MAXINIZE或SW_MINIMIZE分別表示最大和最小模式等等。

以上大體上是WinMain()的參數(shù)的介紹。下面對變量、參數(shù)、常量、類等的命名方法介紹一下。

一、消息

當(dāng)你在DOS下編程的時候,你不必?fù)?dān)心其它程序的運行,因為DOS是獨占模式。但你在Windows平臺上編程時,你不得不考慮其它正在運行的程序。鑒于此,Windows通過“消息”來連接操作申請和具體操作。簡單的說,就是我們指示程序或程序本身向Windows發(fā)出諸如移動窗口、放大窗口、關(guān)閉窗口等申請,Windows再根據(jù)申請,考察實地情況,拒絕或發(fā)出指令,讓程序(計算機)作出相應(yīng)的動作。再例如,鼠標(biāo)隨時向Windows發(fā)出消息,匯報光標(biāo)位置,左鍵或右鍵是否按下等,Windows再根據(jù)消息作出相應(yīng)的反應(yīng)。總之,無論何時,Windows都要隨時掌控所有的消息,而且,Windows是一直不斷地接收到各種消息。

這種功能是通過一種被命名為CALLBACK函數(shù)類型實現(xiàn)的。不用害怕,消息傳遞來傳遞去都是由Windows自己完成的,你只要聲明一個CALLBACK函數(shù)就可以了,就像WINAPI用在WinMain()前一樣。假如還沒有明白,不要緊,往下看你就明白了?,F(xiàn)在,我要離開這個話題一會兒,因為你只有先建立窗口(Windows),傳遞消息才有可能實現(xiàn)。 二、窗口類

現(xiàn)在談?wù)撘稽cC++的知識,因為要想建立一個窗口,你就得先建立一個窗口類。窗口類包含所有的有關(guān)窗口的信息,如用什么樣的鼠標(biāo)符號,菜單樣式等等。開發(fā)任何一個窗口程序,都離不開窗口類的建立。為了達(dá)到此目的,你必須填寫WNDCLASSEX結(jié)構(gòu)。EX的意思是“擴充”的意思,因為有一個老的結(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)實現(xiàn)的。你將會經(jīng)??吹剿?,尤其是你使用了DirectX。

※ UINT style:指定了窗口的風(fēng)格。它經(jīng)常被以CS_打頭的符號常量定義。兩種或兩種以上的風(fēng)格可以通過C語言中的“或”()運算符加以組合。大多數(shù)情況我們只應(yīng)用四種風(fēng)格,出于對文章長度的考慮,我們只列出這四種。若你還需要其它的,到MSDN里找一下好了。當(dāng)然前提是你使用的是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:是指向窗口過程實例的句柄。同時也是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ù)雜。在以后的篇幅里會具體講述的。

※ LPCTSTR lpszMenuName:假如你想建立一個有下拉菜單的窗口,你得給這個參數(shù)賦一個菜單名稱(這涉及到資源),由于你還不知道怎么創(chuàng)建菜單,你就先用NULL設(shè)置成一個沒有菜單的窗口吧。

※ LPCSTR lpszClassName:很顯然,你需要給類起個名字,隨你便,如“**”。要用雙引號引上。

※ HICON hIconSm:指向小圖標(biāo)的句柄。小圖標(biāo)用來顯示在窗口的標(biāo)題欄里。要用到LoadIcon()函數(shù),現(xiàn)在,先用Windows默認(rèn)的吧,LoadIcon(NULL,IDI_WINLOGO)。

好了,現(xiàn)在你關(guān)于WNDCLASSEX結(jié)構(gòu)知道的已經(jīng)差不多了,你可以自己設(shè)置它了。下面是一個例子:



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 佛坪县| 东兴市| 新密市| 扶绥县| 嫩江县| 长武县| 永济市| 衡东县| 龙胜| 兴国县| 嵊州市| 沧州市| 黄冈市| 达孜县| 荔浦县| 稻城县| 老河口市| 惠水县| 祁东县| 博野县| 安西县| 栖霞市| 密山市| 游戏| 施甸县| 英超| 伊川县| 永兴县| 盐池县| 浮山县| 横峰县| 大渡口区| 新化县| 绍兴县| 临西县| 施秉县| 合江县| 西吉县| 集安市| 武冈市| 枝江市|