逐夢旅程 Windows游戲編程 第一篇:使用C++實現一個Windows窗體


今天起開始學習游戲編程,我看的是一本CSDN博主【淺墨】的書《逐夢旅程:Windows游戲編程之從零開始》

此博客記錄自己在學習中所掌握的代碼:

先看第一篇:啟航·夯實游戲程序之根

本章講的是C++的游戲編程基礎

總篇最后是創建一個窗口的完整代碼:

 總的說明了創建一個窗體的具體步驟:創建一個窗體 WinMain函數->窗口創建四部曲->消息循環->窗口類的注銷->窗口過程函數

經過下面的代碼一個窗體幾乎就創建好啦,每行都有清晰注釋

Code:  

  1. //-----------------------------【程序說明】----------------------------------------  
  2. //程序名稱:GameCore  
  3. //2019年1月 Create by Lamica  
  4. //描述:用代碼勾勒出游戲開發所需程序框架  
  5. //--------------------------------------------------------------------------------  
  6.   
  7.   
  8. //-----------------------------【頭部包含部分】-------------------------------------  
  9. //描述:包含程序所依賴的頭文件  
  10. //----------------------------------------------------------------------------------  
  11. #include <Windows.h>  
  12.   
  13. //------------------------------【宏定義部分】----------------------------------------  
  14. //描述:定義一些輔助宏  
  15. //-----------------------------------------------------------------------------------  
  16. #define WINDOW_WIDTH 800  //為窗口寬度定義宏,以方便在此處修改窗口寬度  
  17. #define WINDOW_HEIGHT 600  //為窗口高度定義宏,以方便在此處修改窗口高度  
  18. #define WINDOW_TITLE L"【致我們永不熄滅的游戲開發夢想】程序核心框架" //為窗口標題定義的宏  
  19.   
  20. //------------------------------【全局函數聲明】-----------------------------------------  
  21. //描述:全局函數聲明,防止“未聲明的標識”系列錯誤  
  22. //-------------------------------------------------------------------------------------  
  23. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);  
  24.   
  25. //-------------------------------【WinMain()函數】---------------------------------------  
  26. //描述:Windows應用程序入口函數,我們的程序從這里開始  
  27. //------------------------------------------------------------------------------------  
  28. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {  
  29.     //【1】窗口創建四步曲之一:開始設計一個完整的窗口類  
  30.     WNDCLASSEX wndClass = { 0 };//用WNDCLASSEX定義了一個窗口類  
  31.     wndClass.cbSize = sizeof(WNDCLASSEX);//設置結構體的字節數大小  
  32.     wndClass.style = CS_HREDRAW | CS_VREDRAW; //設置窗口樣式  
  33.     wndClass.lpfnWndProc = WndProc; //設置指向窗口過程函數的指針  
  34.     wndClass.cbClsExtra = 0;//窗口類的附加內存,取0就可以了  
  35.     wndClass.cbWndExtra = 0;//窗口的附加內存,依然取0就可以了  
  36.     wndClass.hInstance = hInstance;//指定包含窗口過程的程序實例句柄  
  37.     wndClass.hIcon = (HICON)::LoadImage(NULL, L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); //本地加載自定義ico圖標  
  38.     wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);//指定窗口類的光標句柄  
  39.     wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//為hbrBackground成員指定一個灰色畫刷句柄  
  40.     wndClass.lpszMenuName = NULL;//用一個以空終止的字符串,指定菜單資源的名字。  
  41.     wndClass.lpszClassName = L"ForTheDreamOfGameDevelop";//用一個以空終止的字符串,指定窗口的名字。  
  42.   
  43.     //【2】窗口創建四步曲之二:注冊窗口類  
  44.     if (!RegisterClassEx(&wndClass))//設計完窗口后,需要對窗口類進行注冊,這樣才能創建該類型窗口  
  45.     {  
  46.         return -1;  
  47.     }  
  48.   
  49.     //【3】窗口創建四步曲之三:正式創建窗口  
  50.     HWND hwnd = CreateWindow(L"ForTheDreamOfGameDevelop", WINDOW_TITLE,//喜聞樂見的創建窗口函數CreateWindow  
  51.         WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);  
  52.   
  53.     //【4】窗口創建四步曲之四:窗口的移動,顯示與更新  
  54.     MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);//調整窗口顯示時的位置,使窗口左上角位於(250,80)處  
  55.     ShowWindow(hwnd, nShowCmd);//調用ShowWindow函數來顯示窗口  
  56.     UpdateWindow(hwnd);//對窗口進行更新,就像我們買了新房子要裝修一樣  
  57.     //【5】消息循環過程  
  58.     MSG msg = { 0 };  //定義並初始化msg  
  59.     while (msg.message != WM_QUIT) //使用while循環,如果消息不是WM_QUIT消息,就繼續循環  
  60.     {  
  61.         if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) //查看應用程序消息隊列,有消息時將隊列中消息派發出去  
  62.         {  
  63.             TranslateMessage(&msg); //將虛擬鍵消息轉換為字符消息  
  64.             DispatchMessage(&msg);//分發一個消息給窗口程序  
  65.         }  
  66.     }  
  67.   
  68.     //【6】窗口類的注銷  
  69.     UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //程序准備結束,注銷窗口類  
  70.     return 0;  
  71. }  
  72.   
  73. //------------------------------------------【WndProc()函數】-------------------------------------  
  74. //描述:窗口過程函數WndProc(回調函數),對窗口消息進行處理  
  75. //-----------------------------------------------------------------------------------------------  
  76. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {  
  77.     switch (message)  //switch 語句開始  
  78.     {  
  79.     case WM_PAINT://若是客戶區重繪消息  
  80.         ValidateRect(hwnd, NULL);//更新客戶區的顯示  
  81.         break;//跳出該switch語句  
  82.     case WM_KEYDOWN://若是鍵盤按下消息  
  83.         if (wParam == VK_ESCAPE) //如果被按下的是ESC  
  84.         {  
  85.             DestroyWindow(hwnd); //銷毀窗口,並發送一條WM_DESTROY消息  
  86.         }  
  87.         break;//跳出該switch語句  
  88.     case WM_DESTROY://若是窗口銷毀消息  
  89.         PostQuitMessage(0);//向系統表明有個線程終止請求。用來響應WM_DESTROY消息  
  90.         break;//跳出該switch語句  
  91.     default://若上述case條件都不符合,則執行該default語句  
  92.         return DefWindowProc(hwnd, message, wParam, lParam);//調用默認窗口過程  
  93.     }  
  94.     return 0;//正常退出  


F5執行結果:

Windows窗體執行結果

 

這樣一個C++窗體就創建完成了

 

 最后分享淺墨大大的一句話:

我們會覺得焦慮,無非是因為現在的我們跟想像中的自己很有差距。打敗焦慮的最好方法,就是去做那些讓你焦慮的事情,不要問,不要等,不要猶豫,不要回頭,既然你認准了這條路,就不要去打聽要走多久。

 

 

 對自己的總結:之前自己是寫C#,和VB.NET的,用他們創建一個窗體,只要會托控件就行了,但是在C++這里,感覺自己離底層更近了,windows的消息處理機制,以及窗口的銷毀,創建整個生命周期在C#,與VB.NET中是完全感覺不到了。

 

 

為了游戲編程夢加油發。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM