#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(HWNDhWnd,LPCTSTRlpText,LPCTSTRlpCaption,UINTuType)
其實是根據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鍵被按下;
...其他跟此類似
新聞熱點
疑難解答