5-9 c語言之【初識win32編程】
阿新 • • 發佈:2019-05-10
message 這就是 解釋 while tran href 都是 需要 消息機制
Windows的消息系統是由3個部分組成的:
·消息隊列。Windows能夠為所有的應用程序維護一個消息隊列。應用程序必須從消息隊列中獲取
消息,然後分派給某個窗口。
·消息循環。通過這個循環機制應用程序從消息隊列中檢索消息,再把它分派給適當的窗口,然
後繼續從消息隊列中檢索下一條消息,再分派給適當的窗口,依次進行。
· 窗口過程。每個窗口都有一個窗口過程來接收傳遞給窗口的消息,它的任務就是獲取消息然後
響應它。窗口過程是一個回調函數;處理了一個消息後,它通常要返回一個值給Windows。
註意回調函數是程序中的一種函數,它是由Windows或外部模塊調用的。
一個消息從產生到被一個窗口響應,其中有5個步驟:
1) 系統中發生了某個事件。
2) Windows把這個事件翻譯為消息,然後把它放到消息隊列中。
3)應用程序從消息隊列中接收到這個消息,把它存放在TMsg記錄中。
4)應用程序把消息傳遞給一個適當的窗口的窗口過程。
5) 窗口過程響應這個消息並進行處理。
----------------------------------------------------------------------------------------
這是一個很全面的一個解釋了,就相當於一個比方,在一個屋子裏,每個人都擁有自己的桌子,然後此時快遞在外面排著隊進來,嚴格遵守排隊秩序,然後一個快遞來了之後,我們拆開看是否位自己需要的,如果需要的話就接受它,如果不需要的話另行處理(不是銷毀)。那麽在這段比喻中,每個人都是一個窗口,快遞就是消息,這裏的消息就是敲擊鍵盤,點擊鼠標等一系列外設動作,那麽這些消息按照隊列的數據結構進行排列,然後通過循環的方式讓每個窗口都能找到屬於自己的消息,這就是win32的消息機制。
關於一些小概念在這裏進行一下解釋
---恢復內容開始---
今天學習了win32的相關知識,首先win32是指是指可以在32位或以上Windows系統中運行的程序,我學習的主要利用c/c++語言編寫的win32程序,
首先在win32中開始一個項目需要經歷 1.窗口設計 2. 註冊 3.創建 4.顯示 五個部分,其中的難點就在於窗口設計中 lpfnWndProc 消息處理函數的編寫,win32的精髓就在於它的消息機制,
在百度百科中關於消息機制是這樣闡述的:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- 應用實例:應用只有一個,實例可以多個,比如qq一臺電腦只能裝一個,但可以點開多個窗口,此時多個窗口每個都是應用實例
- 句柄:類似於指針,保存的是地址,但是只能看內容,不能對其進行修改;
- 在創建窗口的過程中,屏幕的左上角為坐標原點,並且長度的單位,為像素;
- 前一個應用實例:比如通過微信打開qq,微信為qq的應用實例(區別於子窗口)
- 調用約定:是指當一個函數被調用時,函數的參數會被傳遞給被調用的函數和返回值會被返回給調用函數。函數的調用約定就是描述參數是怎麽傳遞和由誰平衡堆棧的,當然還有返回值
先放上來一個 利用win32創建窗口的程序
1 #include<Windows.h> 2 LRESULT CALLBACK MyWNDPROC(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam); 3 int CALLBACK Winmain( 4 HINSTANCE hInstance, 5 HINSTANCE hPrevInstance, 6 LPSTR lpCmdLine, 7 int nCmdShow 8 ) 9 { 10 MSG msg; 11 HWND hwnd; 12 WNDCLASSEX ex; 13 ex.style = CS_HREDRAW | CS_VREDRAW; 14 ex.cbSize = sizeof(ex); 15 ex.cbClsExtra = 0; 16 ex.cbWndExtra = 0; 17 ex.hInstance = hInstance; 18 ex.hIcon = NULL; 19 ex.hCursor = NULL; 20 ex.hbrBackground = CreateSolidBrush(RGB(0,255,0)); 21 ex.hIconSm = NULL; 22 ex.lpfnWndProc = &MyWNDPROC; 23 ex.lpszMenuName = NULL; 24 ex.lpszClassName = "AA"; 25 26 RegisterClassEx(&ex); 27 28 hwnd = CreateWindow(ex.lpszClassName,"你好中國",WS_OVERLAPPEDWINDOW,50,50,100,100,NULL,NULL,hInstance,NULL); 29 30 ShowWindow(hwnd,SW_SHOW); 31 32 while(GetMessage(&msg,NULL,0,0)) 33 { 34 TranslateMessage(&msg); 35 DispatchMessage(&msg); 36 } 37 38 39 40 41 return 0; 42 } 43 LRESULT CALLBACK MyWNDPROC(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam) 44 { 45 switch(message) 46 case WM_CLOSE: 47 break; 48 return DefWindowProc(hwnd,message,wparam,lparam); 49 }
2019-05-09 23:56:50 編程小菜鳥自我反省,大佬勿噴,謝謝!!!
5-9 c語言之【初識win32編程】