在“構(gòu)建游戲設(shè)計的舞臺”這一隨筆中,建立的項目便是一個標準Windows API的程序架構(gòu),主程序文件“canvas.cpp”由下表中幾個重要的函數(shù)所構(gòu)成:
函數(shù)名稱
|
說明
|
WinMain
|
主程序,程序起始點
|
WndProc
|
自定義函數(shù),處理程序消息
|
MyRegisterClass
|
自定義函數(shù),注冊窗口類別
|
InitInstance
|
自定義函數(shù),建立及顯示窗口的初始化函數(shù)
|
下面來說說這些函數(shù)的內(nèi)容與功能。
1.WinMain函數(shù) 主程序,也就是整個項目程序開始運行的地方,如同Console程序中的main()函數(shù)。
//****主程序***********************************
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
  {
MSG msg;
 /**//**********************************************************
* 自定義函數(shù),注冊窗口類別
* 調(diào)用MyRegisterClass()函數(shù),向系統(tǒng)注冊窗口類別,輸入?yún)?shù)
* “hInstance”是目前程序運行個體的對象代碼
**********************************************************/
MyRegisterClass(hInstance);
// 運行初始化函數(shù),調(diào)用InitInstance()函數(shù),進行初始化操作
if (!InitInstance (hInstance, nCmdShow))
  {
return FALSE;
}
 /**//******************************************************************
* 消息循環(huán)
* 程序通過此消息循環(huán)來獲取消息,并進行必要的鍵盤消息轉(zhuǎn)換,
* 而后將控制權(quán)交給操作系統(tǒng),由操作系統(tǒng)決定該由哪個程序的
* 消息處理函數(shù)處理消息。這個循環(huán)使用了3個API函數(shù)
* GetMessage 獲取程序消息
* TranslateMessage 轉(zhuǎn)換偽碼及字符
* DispatchMessage 將控制權(quán)交給系統(tǒng),再由系統(tǒng)決定負責處理消息的程序
******************************************************************/
while (GetMessage(&msg, NULL, 0, 0))
  {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
2.MyRegisterClass函數(shù)
 /**//*****************************************************************
* 在建立程序窗口的實體之前,必須先定義一個窗口類別,其中包含所要
* 建立窗口的相關(guān)信息,并向系統(tǒng)注冊。這里的MyRegisterClass()函數(shù)
* 就是進行定義及注冊窗口類別的函數(shù)
*****************************************************************/
ATOM MyRegisterClass(HINSTANCE hInstance)
  {
//聲明一個窗口類別“WNDCLASSEX”和結(jié)構(gòu)“wcex”
WNDCLASSEX wcex;

 /**//***************************Begin***********************************/
// 定義“wcex”結(jié)構(gòu)的各項信息,其中設(shè)定消息處理函數(shù)(IpfnWndProc)為
// “WndProc”,類別名稱(lpszClassName)為“canvas”。
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
// 設(shè)定消息處理函數(shù)
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;

//類別名稱
wcex.lpszClassName = "canvas";
wcex.hIconSm = NULL;
 /**//****************************End************************************/

// 調(diào)用RegisterClassEx()函數(shù)注冊類別,返回一個“ATOM”形態(tài)的字符串,此字符串即為類別名稱“canvas”
return RegisterClassEx(&wcex);
}
3.InitInstance函數(shù)
// 在這一初始函數(shù)中,按照前面所定義的窗口類別來建立并顯示實際的程序窗口
//*****初始化函數(shù)*******************************
// 1.存儲instance handle于全局變量中
// 2.建立并顯示主窗口
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  {
HWND hWnd;

hInst = hInstance;
// 調(diào)用CreateWindow()函數(shù)來建立一個窗口對象,所輸入的第1個參數(shù)
// 就是窗口建立所依據(jù)的類別名稱,也就是前面程序所定義的“canvas”
hWnd = CreateWindow("canvas", "繪圖窗口" , WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)
 {
return FALSE;
}

// 下面三條語句,設(shè)定窗口的顯示位置及窗口大小,然后繪制在顯示設(shè)備上
// 設(shè)定窗口顯示的位置及窗口大小
MoveWindow(hWnd,10,10,600,450,true);
// 設(shè)定窗口顯示時的狀態(tài)
ShowWindow(hWnd, nCmdShow);
// 將窗口繪制于顯示設(shè)備上
UpdateWindow(hWnd);

return TRUE;
}
4.WndPro函數(shù)
 /**//********************************************************************************
* 在前面定義類別的時候把WndPro定義為消息處理函數(shù),也就是當某些外部消息發(fā)生時,會
* 按照消息的類型來決定該如何進行處理。
* 此外,WndPro函數(shù)也是一個所謂的“回調(diào)函數(shù)(CALLBACK)”,簡單地說,回調(diào)函數(shù)是屬于
* Windows操作系統(tǒng)所調(diào)用的函數(shù),而非程序本身所調(diào)用的函數(shù),這是因為Windows是一個多任
* 務(wù)的作業(yè)環(huán)境,在同一時刻可能會有多個程序正在運行,而當某一事件發(fā)生時,有可能每一
* 個程序都會接受到此消息,因此系統(tǒng)必須去判斷該由哪個程序進行處理,然后再調(diào)用該程序
* 的消息處理函數(shù)。
********************************************************************************/
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  {
PAINTSTRUCT ps;
HDC hdc;

// 判斷消息類型
switch (message)
 {
case WM_PAINT: //窗口重繪消息
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY: //窗口結(jié)束消息
 /**//***********************************************************
* 調(diào)用PostQuitMessage()函數(shù)發(fā)送窗口結(jié)束消息給系統(tǒng),通知
* 系統(tǒng)結(jié)束目前程序的運行,然后由系統(tǒng)處理程序結(jié)束的后續(xù)操作
***********************************************************/
PostQuitMessage(0);
break;
default: //其他消息
// DefWindowProc()函數(shù)調(diào)用預(yù)設(shè)的系統(tǒng)函數(shù)來處理程序本身不處理的消息
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
下載源代碼: canvas.rar(文件上傳在Windows live空間,可能需要有msn賬號進行登錄) PS:如想獲得更多關(guān)于Visual C++游戲開發(fā)的內(nèi)容,可點擊隨筆 :《Visual C++游戲編程基礎(chǔ)》學(xué)習(xí)筆記——索引隨筆。
|