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

 /**//***************************Begin***********************************/
// 定義“wcex”結構的各項信息,其中設定消息處理函數(IpfnWndProc)為
// “WndProc”,類別名稱(lpszClassName)為“canvas”。
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
// 設定消息處理函數
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************************************/

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

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

if (!hWnd)
 {
return FALSE;
}

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

return TRUE;
}
4.WndPro函數
 /**//********************************************************************************
* 在前面定義類別的時候把WndPro定義為消息處理函數,也就是當某些外部消息發生時,會
* 按照消息的類型來決定該如何進行處理。
* 此外,WndPro函數也是一個所謂的“回調函數(CALLBACK)”,簡單地說,回調函數是屬于
* Windows操作系統所調用的函數,而非程序本身所調用的函數,這是因為Windows是一個多任
* 務的作業環境,在同一時刻可能會有多個程序正在運行,而當某一事件發生時,有可能每一
* 個程序都會接受到此消息,因此系統必須去判斷該由哪個程序進行處理,然后再調用該程序
* 的消息處理函數。
********************************************************************************/
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: //窗口結束消息
 /**//***********************************************************
* 調用PostQuitMessage()函數發送窗口結束消息給系統,通知
* 系統結束目前程序的運行,然后由系統處理程序結束的后續操作
***********************************************************/
PostQuitMessage(0);
break;
default: //其他消息
// DefWindowProc()函數調用預設的系統函數來處理程序本身不處理的消息
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
下載源代碼: canvas.rar(文件上傳在Windows live空間,可能需要有msn賬號進行登錄) PS:如想獲得更多關于Visual C++游戲開發的內容,可點擊隨筆 :《Visual C++游戲編程基礎》學習筆記——索引隨筆。
|