1 #include<windows.h> 2 3 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//CALLBACK函數由Windows調用
WndProc函數用來處理用戶在窗口上下達的指令。
步驟:
1.窗口類結構 WNDCLASS
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int iCmdShow) { static TCHAR szAppName[]=TEXT("類的名字"); HWND hwnd; MSG msg; WNDCLASS wndclass; //CS 類風格選項 wndclass.style=CS_HREDRAW|CS_VREDRAW;// 調整高度(vehicle)、寬度(horizon)后是否重繪窗口 wndclass.lpfnWndProc=WndProc;// wndclass. cbClsExtra=0;//預留的額外空間 wndclass.cbWndExtra=0;//預留的額外空間 wndclass.hInstance=hInstance;//應用程序的實力句柄 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//為所有基於該窗口的類 ; IDI圖標的ID號,IDIcon wndclass.hCursor=LoadCursor(NULL,IDC_ARROW) ;// 光標; IDC光標的ID號 ,IDCursor wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);// wndclass.lpszMenuName=NULL;//菜單 wndclass.lpszClassName=szAppName;//窗口類的名字,第七行
2.注冊窗口類 RegisterClass
1 if(!RegisterClass(&wndclass)) 2 { //MB 消息框選項 3 MessageBox(NULL,TEXT("這個程序需要在Windows NT才能執行!"),szAppName,MB_ICONERROR); 4 return 0; 5 }
3.創建窗口實例 CreateWindow 此時窗口在內存中誕生(句柄),但還未顯示出。
1 hwnd= CreateWindow(szAppName, 2 TEXT("學習Windows編程"), 3 WS_OVERLAPPEDWINDOW,// WS 窗口風格 OVERLAPPEDWINDOW很多屬性疊加 4 CW_USEDEFAULT,// 初始x坐標 CW 創建窗口選項 create window 5 CW_USEDEFAULT, //初始y坐標 6 CW_USEDEFAULT, //初始x方向尺寸 7 CW_USEDEFAULT,//初始y方向尺寸 8 NULL, // 父窗口句柄 9 NULL, // 窗口菜單句柄 10 hInstance, // 程序實例句柄 11 NULL);// 創建參數
4.顯示窗口 ShowWindow
ShowWindow(hwnd,iCmdShow);//顯示窗口
5.更新窗口 UpdateWindow
1 UpdateWindow(hwnd);//更新窗口 2 3 4 //消息循環 5 while(GetMessage(&msg,NULL,0,0)) 6 { 7 TranslateMessage(&msg); 8 DispatchMessage(&msg); 9 } 10 11 return msg.wParam; 12 13 }
LRESULT CALLBACK Wndproc函數
hwnd是要處理窗口的句柄,message是消息ID,代表了不同的消息類型,wParam的值為按下按鍵的虛擬鍵碼,lParam則存儲按鍵的相關狀態信息。
7 8 9 10 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 11 { 12 HDC hdc; 13 PAINTSTRUCT ps;//存放繪制窗口需要的參數 14 RECT rect; //定義了矩形左上角和右下角的坐標 15 16 switch (message) 17 { 18 case WM_PAINT: 19 hdc = BeginPaint(hwnd, &ps); //device context 設備環境 20 GetClientRect(hwnd, &rect); //獲得客戶區位置坐標信息 21 DrawText(hdc, TEXT("這里是徐徐風的第一個窗口~"), -1, &rect, 22 DT_SINGLELINE | DT_CENTER | DT_VCENTER);//分別是顯示在 一行,居中,垂直居中 23 EndPaint(hwnd, &ps); 24 return 0; 25 case WM_DESTROY: 26 PostQuitMessage(0); 27 return 0; 28 } 29 30 return DefWindowProc(hwnd, message, wParam, lParam); 31 }
另外:
消息機制 : 1.FIFO 先進先出
2.WM_PAINT,WM_TIMER,WM_QUIT這三個消息時刻在消息隊列最后
3.消息分為隊列化和非隊列化消息