Windows程式設計入門——從一個簡單的視窗說起
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL,"苟利國家生死以,豈因禍福避趨之","唸詩",MB_OK);
return 0;
}
這就是最簡單的一個Win32程式,裡面有很多宣告都是以前在C/C++學習中沒有見到過的。
WinMain():是和以往程式設計中的main()等價的東西.這是程式開始執行的入口;
HINSTANCE hInstance:程式可執行模組的控制代碼;
HINSTANCE hPrevInstance:總是為NULL;
LPSTR lpCmdLine:命令列引數組成的一個單字串,不包括程式名;
int nCmdShow:要傳遞給ShowWindow()的一個整數。
主程式中出現的MessageBox()原型為:int WINAPI MessageBox(
HWND
hWnd,
LPCTSTR
lpText,
LPCTSTR
lpCaption,
UINT
uType)
其實是根據Unicode的定義來的:
WINUSERAPI int WINAPI MessageBoxA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType); WINUSERAPI int WINAPI MessageBoxW( HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType); #ifdef UNICODE #define MessageBox MessageBoxW//如果啟用Unicode庫,就用MessageBoxW #else #define MessageBox MessageBoxA//否則,就用MessageBoxA #endif
單單隻有一個視窗未免也太low了,我們可以增加一些互動元素,比如對於滑鼠點選的處理。
這時我們可以嘗試著把WM_LBUTTONDOWN新增到WndProc()中,看看能夠發生什麼
WndProc()部分的完整程式碼如下:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_LBUTTONDOWN: { char szFileName[MAX_PATH]; HINSTANCE hInstance=GetModuleHandle(NULL); GetModuleFileName(hInstance, szFileName, MAX_PATH); MessageBox(hwnd, "視窗彈出成功", "新訊息", MB_OK|MB_ICONINFORMATION); } break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; }
在程式中加入這樣一段程式碼之後,在程式視窗中點選一下,便會彈出一個新的視窗。具體效果如下圖所示:
深入研究WndProc函式:
WinProc是視窗回撥過程。Windows通過它將事件傳遞給程式。回撥函式是被呼叫回來的函式。這個函式處理所有傳送給主程式視窗的訊息。所以,通常WinProc是主程式原始碼檔案中最長的函式。
需要了解這個函式,因為它是通向初始化Direct3D的鑰匙。它的引數既簡單又直白,它們代表Windows程式的真實“引擎”。據前述,這一資訊是早先在WinMain中由GetMessage函式獲取的。不要將InitInstance和WinProc混淆在一起。InitInstance只執行一次,對選項進行設定。而後就由WinProc接管,接收並處理訊息。
有關於WinProc的引數:
HWND hWnd:在遊戲中,通常要使用hWnd作為引數建立一個新的裝置環境控制代碼,也就是一個hDC。在DirectX到來之前,必須要保留好視窗控制代碼,因為只要引用一個視窗或控制元件就必須使用到它。在DirectX程式中,視窗控制代碼僅在開始時用於建立視窗。
UINT messgae:傳送給視窗回撥過程的訊息。訊息可以是任何東西,甚至是無需使用的訊息。由於這個原因,有一個將訊息傳遞給預設訊息處理器的方法。
WPARAM wParam和LPARAM lParam:與特定命令訊息一起傳遞過來的引數值的高位和低位。
關於按鍵訊息捕捉的引數:
MK_CONTROL:鍵盤上Ctrl鍵被按下;
MK_LBUTTON:滑鼠左鍵被按下;
MK_MBUTTON:滑鼠中鍵被按下;
MK_RBUTTON:滑鼠右鍵被按下;
MK_SHIFT:鍵盤Shift鍵被按下;
...其他跟此類似