學習c++有段時間了,一直雨裏霧裏,看到了淺墨大神寫的《windows遊戲編程之從零開始》,又激發了我繼續學習的動力,因爲我也打dota,哈哈哈哈!
學到了第三章,創建了一個完整的窗口程序,代碼照着書上抄的,抄了100行,錯了三個地方,兩處拼寫錯誤,一處case條件後面沒加冒號,不過比剛學的時候抄代碼強多了,一個Hello world都能錯好多次。
以後我會持續發我抄的代碼,或者是寫的代碼,以此來督促我持續學習。
下面是抄的代碼,有需要的儘管用
// -------------【程序說明】---------------
//程序名稱:GameCore//2015年4月28日20:22:31 by 邊哥
// 描述:用代碼勾勒出遊戲開發所需要的程序框架
//---------------------------------------------------
//---------------【頭文件包含部分】------------------
//描述:包含程序所依賴的頭文件-------------------------
//--------------------------------------------
#include<windows.h>
//----------------【宏定義部分】----------------------
//描述:定義一些輔助宏
//---------------------------------------------
#define WINDOW_WIDTH 800 // 爲窗口寬度定義的宏,以方便在此處修改窗口寬度
#define WINDOW_HEIGHT 600 //爲窗口高度定義的宏,以方便在此處修改窗口高度
#define WINDOW_TITLE L"【致我們的遊戲開發夢想】程序核心框架" //爲窗口標題定義的宏
//-------------------【全局函數聲明部分】--------------
//描述:全局函數聲明,防止“未聲明的標識”系列錯誤
//--------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam);// 窗口過程函數
//-------------------【WinMian()函數】------------------------------
//描述:Windows應用程序的入口函數,我們的程序從這開始
//--------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
//【1】窗口創建四部曲之一:開始設計一個完整的窗口類
WNDCLASSEX wndClass = {0}; //用WINDCLASSEX定義一個窗口類
wndClass.cbSize = sizeof(WNDCLASSEX);// 設置結構體的字節數大小
wndClass.style = CS_HREDRAW | CS_VREDRAW; //設置窗口的樣式
wndClass.lpfnWndProc = WndProc; //設置指向窗口過程函數的指針
wndClass.cbClsExtra = 0; //窗口類的附加內存,取0就可以了
wndClass.cbWndExtra = 0; //窗口的附加內存,依然取0
wndClass.hInstance = hInstance; //指定包含窗口過程的程序的實例句柄
wndClass.hIcon = (HICON)::LoadImage(NULL,L"icon.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //本地加載自定義ico圖標
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //指定窗口類的光標句柄
wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //爲hbrBackground成員指定一個灰色畫刷句柄
wndClass.lpszMenuName = NULL; //用一個以空終止的字符串,指定菜單資源的名字
wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //用一個以空終止的字符串,指定窗口類的名字
//【2】窗口創建四部曲之二:註冊窗口類
if( !RegisterClassEx( &wndClass ) ) //設計完窗口後,需要對窗口進行註冊,才能創建該類型的窗口
return -1;
//【3】窗口創建四部曲之三:正式創建窗口
HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop", WINDOW_TITLE,
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT,
NULL, NULL, hInstance, NULL );
//【4】窗口創建四部曲之四:窗口的移動。顯示與更新
MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //調整窗口顯示時的位置,使窗口左上角位於(250,80)處
ShowWindow( hwnd, nShowCmd ); // 調用ShowWindow函數來顯示窗口
UpdateWindow(hwnd); //對窗口進行更新
//【5】消息循環過程
MSG msg = { 0 }; // 定義並初始化msg
while( msg.message != WM_QUIT ) //使用while循環,如果消息不是WM_QUIT消息,就繼續循環
{
if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) // 查看應用程序消息隊列,有消息時將隊列中的消息派發出去
{
TranslateMessage( &msg ); // 將虛擬鍵消息轉換爲字符消息
DispatchMessage( &msg ); //分發一個消息給窗口程序
}
}
//【6】窗口類的註銷
UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //程序準備結束,註銷窗口類
return 0;
}
//---------------------------【WndProc()函數】------------------------
//描述:窗口過程函數WndProc,對窗口消息進行處理
//--------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch( message ) //switch語句開始
{
case WM_PAINT: //若是客戶區重繪消息
ValidateRect(hwnd, NULL); // 更新客戶區的顯示
break;
case WM_KEYDOWN: //若是鍵盤按下消息
if (wParam == VK_ESCAPE) // 如果按下的是ESC
DestroyWindow(hwnd);
break;
case WM_DESTROY: //若是窗口銷燬消息
PostQuitMessage( 0 ); // 向系統表明有個線程有終止請求,用來響應WM_DESTROY消息
break; //跳出該switc語句
default: //若上述case條件都不符合,則執行該default語句
return DefWindowProc( hwnd, message, wParam, lParam ); //調用默認的窗口過程
}
return 0; // 正常退出
}