事件驅動編程模型 一切都是窗口:窗口和句柄 消息與消息隊列 設計->注冊->創建->顯標更新->消息。
#include <windows.h>//窗口過程回調函數 H是Handler的簡寫,句柄LRESULT CALLBACK WndPRoc(HWND,UINT,WPARAM,LPARAM);//相當于 int main()// 實例句柄int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){ HWND hwnd;//窗口句柄 MSG msg;//消息 WNDCLASS wc;//窗口類 //1.設計一個窗口類 wc.style = 0; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("MyWndClass"); //2.注冊窗口類 RegisterClass(&wc); //3.創建窗口 hwnd = CreateWindow( TEXT("MyWndClass"), TEXT("Hello SDK application"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,//父窗口句柄 NULL,//窗口菜單句柄 hInstance, NULL); //4.顯示和更新窗口 ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); //5.消息循環 while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg);//轉發到窗口過程 } return msg.wParam;}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdc;//DC句柄 RECT rect; //對各種消息進行處理 switch(message) { case WM_SIZE: //重畫 Paint return 0; case WM_LBUTTONDOWN: //MessageBox(hwnd,TEXT("Mouse Clicked!"),TEXT("消息"),MB_OK); //PostQuitMessage(0); return 0; case WM_PAINT: //繪制消息 hdc = BeginPaint(hwnd,&ps); GetClientRect(hwnd,&rect); //Ellipse(hdc,0,0,200,100); DrawText(hdc,TEXT("Hello, Windows!"),-1,&rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd,&ps); return 0; case WM_DESTROY://銷毀窗口消息(關閉) PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wParam,lParam);}handle HINSTANCE//模塊句柄 HWND //窗口句柄 HDC //畫布句柄 HICON //圖標句柄 HCURSOR //光標句柄 HBRUSH //畫刷句柄
WNDCLASS 窗口類
typedef struct _WNDCLASS {UINT style; // 窗口類型WNDPROC lpfnWndProc; //窗口處理函數int cbClsExtra; //窗口擴展int cbWndExtra; //窗口實例擴展HINSTANCE hInstance; //實例句柄HICON hIcon; //窗口的最小化圖標HCURSOR hCursor; //窗口鼠標光標HBRUSH hbrBackground; //窗口背景色LPCTSTR lpszMenuName; //窗口菜單LPCTSTR lpszClassName; // 窗口類名} WNDCLASS, *LPWNDCLASS;MSG 消息結構
typedef struct tagMSG{ HWND hwnd; 窗口句柄(索引內存當中的資源) UINT(無符號整型) message; WPARAM(整型) wParam; //關于消息的附加參數,例如:按下一個鍵,具體是哪個按鍵 LPARAM(整型) LParam; //關于消息的附加參數 DWord(32位整數) time;//消息被傳遞時候的時間 POINT(坐標結構體) pt; //消息被傳遞時候,光標在屏幕上的位置} MSG;PAINTSTRUCT畫布結構
typedef struct tagPAINTSTRUCT { HDC hdc;//用于繪制的句柄 BOOL fErase;//如果為非零值則擦除背景,否則不擦除背景 RECT rcPaint;//通過制定左上角和右下角的坐標確定一個要繪制的矩形范圍,該矩形單位相對于客戶區左上角 BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32];} PAINTSTRUCT, *PPAINTSTRUCT;RECT 矩型結構
typedef struct tagRECT{LONG left; //指定矩形左上角的X坐標LONG top; //指定矩形左上角的Y坐標LONG right; //指定矩形右下角的X坐標LONG bottom;//指定矩形右下角的Y坐標} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;新聞熱點
疑難解答