程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 送給初學者的禮物:C++游戲編程起源連載一

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

編輯:C++入門知識

  第一章 Windows編程基礎
  
  簡介
  
  本章目的是介紹WINDOWS編程基礎。在本章結束時,你應該能夠很好的工作了,雖燃可能是簡單的WINDOWS程序。你需要有C語言的基礎知識,我很少將C++的代碼擴充到程序中。當然,由於WINDOWS本身就是面向對象的,一點類的知識是不會對你有什麼損害的。假如你不熟悉C++,沒有關系,我想你還是能從我這裡學到大部分的東西。所有的程序代碼都通過了MICROSOFT VISUAL C++6.0的編譯,假如你還沒有合適的編譯器,那就用它好了,還是很棒的。開動吧!
  
  多數的Windows程序都需要Windows.h和Windowsx.h這兩個頭文件,要確保使用它們。當然,你還需要其它的標准的C的頭文件,象stdio.h,conio.h等。除了這些,你還會經常看到在程序的開始有這樣一行代碼:
  
  
#define WIN32_LEANAND_MEAN

  
  它表示Windows的頭文件中將拒絕接受MFC的東西,這將加速你的build時間。假如你從沒有打算應用MFC在你的游戲編程中,那就使用它吧。假如你以前從沒有看過這種聲明類型——在#define後,直接加上一個“單詞”,那麼它的作用就是有條件編譯。看看下面的例子:
  
  
#ifdef DEBUG_MODE printf("Debug mode is active!"); #endif

  
  意思是:假如程序的開始包含#define DEBUG_MODE,那麼就printf(),否則退出。這個對於你跟蹤程序的邏輯錯誤是很有幫助的。
  
  WinMain()函數
  
  DOS下的C語言從main()開始,Windows下的C語言從WinMain()開始,一個空的WinMain()函數是這樣的:
  
  
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { return(0); }

  
  一個函數即使什麼也沒做,也應該返回一個值。是的,有好多東西我們不熟悉。首先的首先,WINAPI是個什麼聲明?WINAPI是在windows.h頭文件中定義的一個宏,它把函數調用翻譯成正確的調用約定。當我們在程序中需要用到匯編語言的時候,我們在來深究它好了,記住,假如要用WinMain(),就必須要有WINAPI。
  
  下一步讓我們來看看括號裡的四個參數:
  
  ◎ HINSTANCE hinstance:HINSTANCE是一個句柄類型的標識符。變量hinstance是一個整數,用於標識程序實例。Windows設置這個參數的值,並把它傳遞給你的程序代碼。很多Windows函數都要用到它。
  
  ◎ HINSTANCE hPreInstance:你不用擔心這個參數,它已經被廢掉了。它只是為古老的Windows版本服務的。你將還會看到類似的情況。
  
  ◎ LPSTR lpCmdLine:是一個指向字符串的指針,它僅在程序名是從DOS命令行輸入或是從Run對話框中輸入時才起作用。因此,很少被程序代碼所用。
  
  ◎ int nCmdShow:決定了窗口在初始顯示時的狀態。Windows通常給這個參數分配一個值。通常是SW_打頭的一個常量。例如SW_SHOWNORMAL表示默認狀態,SW_MAXINIZE或SW_MINIMIZE分別表示最大和最小模式等等。
  
  以上大體上是WinMain()的參數的介紹。下面對變量、參數、常量、類等的命名方法介紹一下。
  
  一、消息
  
  當你在DOS下編程的時候,你不必擔心其它程序的運行,因為DOS是獨占模式。但你在Windows平台上編程時,你不得不考慮其它正在運行的程序。鑒於此,Windows通過“消息”來連接操作申請和具體操作。簡單的說,就是我們指示程序或程序本身向Windows發出諸如移動窗口、放大窗口、關閉窗口等申請,Windows再根據申請,考察實地情況,拒絕或發出指令,讓程序(計算機)作出相應的動作。再例如,鼠標隨時向Windows發出消息,匯報光標位置,左鍵或右鍵是否按下等,Windows再根據消息作出相應的反應。總之,無論何時,Windows都要隨時掌控所有的消息,而且,Windows是一直不斷地接收到各種消息。
  
  這種功能是通過一種被命名為CALLBACK函數類型實現的。不用害怕,消息傳遞來傳遞去都是由Windows自己完成的,你只要聲明一個CALLBACK函數就可以了,就像WINAPI用在WinMain()前一樣。假如還沒有明白,不要緊,往下看你就明白了。現在,我要離開這個話題一會兒,因為你只有先建立窗口(Windows),傳遞消息才有可能實現。 二、窗口類
  
  現在談論一點C++的知識,因為要想建立一個窗口,你就得先建立一個窗口類。窗口類包含所有的有關窗口的信息,如用什麼樣的鼠標符號,菜單樣式等等。開發任何一個窗口程序,都離不開窗口類的建立。為了達到此目的,你必須填寫WNDCLASSEX結構。EX的意思是“擴充”的意思,因為有一個老的結構叫作WNDCLASS,這裡,我們將使用WNDCLASSEX結構,它的樣子如下:
  
  

   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;

  
  這個結構有不少成員,討厭的是,你必須為窗口類設置每一個成員。莫發愁,紙老虎一個。讓我們來個速成。
  
  ※ UINT cbSize:指定了以字節為單位的結構的大小。這個成員是通過sizeof(WNDCLASSEX)實現的。你將會經常看到它,尤其是你使用了DirectX。
  
  ※ UINT style:指定了窗口的風格。它經常被以CS_打頭的符號常量定義。兩種或兩種以上的風格可以通過C語言中的“或”()運算符加以組合。大多數情況我們只應用四種風格,出於對文章長度的考慮,我們只列出這四種。若你還需要其它的,到MSDN裡找一下好了。當然前提是你使用的是Visual C++。
  
  ◎ CS_HREDRAW:一旦移動或尺寸調整使客戶區的寬度發生變化,就重新繪制窗口。
  
  ◎ CS_VREDRAW:一旦移動或尺寸調整使客戶區的高度發生變化,就重新繪制窗口。
  
  ◎ CS_OWNDC:為該類中的每一個窗口分配一個唯一的設備上下文。
  
  ◎ CS_DBLCLKS:當用戶雙擊鼠標時向窗口過程發送雙擊消息。
  
  ※ WNDPROC lpfnWndProc:是指向窗口過程的指針。一般都指向CALLBACK函數。假如你沒有用過函數指針,簡單理解為函數的地址就是函數的名字,名字後面別帶括號。
  
  ※ int cbClsExtra:它是為類保留的額外信息 。大多數程序員不用它,你在在寫游戲程序時也不太可能用它,所以,設為0好了。
  
  ※ int cbWndExtra:同上一個差不多,設為0好了。
  
  ※ HANDLE hInstance:是指向窗口過程實例的句柄。同時也是WinMain()函數的參數之一。應該設置為hinstance。
  
  ※ HICON hIcon:指向窗口圖標的句柄,它通常被LoadIcon()函數設置。在你學會如何在你的程序中使用資源前,你先設置成如下樣子:LoadIcon(NULL,IDI_WINLogo)。當然,還有一些其它的IDI_打頭的符號常量,可以自己去幫助文件裡尋找。
  
  ※ HCURSOR hCursor:指向窗口光標的句柄,它通常被LoadCursor()函數設置,在你學會如何在你的程序中使用資源前,你先用Windows默認的吧,LoadCursor(NULL,IDC_ARROW)。
  
  ※ HBRUSH hbrBackground:當你的窗口過程得到消息,要求刷新(或重畫)窗口時,至少要用一種純色或“brush”(畫刷)重畫窗口區域,畫刷是由參數確定的。你可以使用GetStockObject()函數調用幾種常備的畫刷,如BLACK_BRUSH, WHITE_BRUSH, GRAY_BRUSH等。現在,你就用GetStockObject(BLACK_BRUSH)吧。也許你覺得我說的太簡單了,是因為不想把開始弄得太復雜。在以後的篇幅裡會具體講述的。
  
  ※ LPCTSTR lpszMenuName:假如你想建立一個有下拉菜單的窗口,你得給這個參數賦一個菜單名稱(這涉及到資源),由於你還不知道怎麼創建菜單,你就先用NULL設置成一個沒有菜單的窗口吧。
  
  ※ LPCSTR lpszClassName:很顯然,你需要給類起個名字,隨你便,如“**”。要用雙引號引上。
  
  ※ HICON hIconSm:指向小圖標的句柄。小圖標用來顯示在窗口的標題欄裡。要用到LoadIcon()函數,現在,先用Windows默認的吧,LoadIcon(NULL,IDI_WINLogo)。
  
  好了,現在你關於WNDCLASSEX結構知道的已經差不多了,你可以自己設置它了。下面是一個例子:
  
  

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved