1. 程式人生 > >5-9 c語言之【初識win32編程】

5-9 c語言之【初識win32編程】

message 這就是 解釋 while tran href 都是 需要 消息機制

---恢復內容開始---

今天學習了win32的相關知識,首先win32是指是指可以在32位或以上Windows系統中運行的程序,我學習的主要利用c/c++語言編寫的win32程序,

首先在win32中開始一個項目需要經歷 1.窗口設計 2. 註冊 3.創建 4.顯示 五個部分,其中的難點就在於窗口設計中 lpfnWndProc 消息處理函數的編寫,win32的精髓就在於它的消息機制,

在百度百科中關於消息機制是這樣闡述的:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

Windows的消息系統是由3個部分組成的: ·消息隊列。Windows能夠為所有的應用程序維護一個消息隊列。應用程序必須從消息隊列中獲取 消息,然後分派給某個窗口。 ·消息循環。通過這個循環機制應用程序從消息隊列中檢索消息,再把它分派給適當的窗口,然 後繼續從消息隊列中檢索下一條消息,再分派給適當的窗口,依次進行。 · 窗口過程。每個窗口都有一個窗口過程來接收傳遞給窗口的消息,它的任務就是獲取消息然後 響應它。窗口過程是一個回調函數;處理了一個消息後,它通常要返回一個值給Windows。 註意回調函數是程序中的一種函數,它是由Windows或外部模塊調用的。
一個消息從產生到被一個窗口響應,其中有5個步驟: 1) 系統中發生了某個事件。 2) Windows把這個事件翻譯為消息,然後把它放到消息隊列中。 3)應用程序從消息隊列中接收到這個消息,把它存放在TMsg記錄中。 4)應用程序把消息傳遞給一個適當的窗口的窗口過程。 5) 窗口過程響應這個消息並進行處理。 ---------------------------------------------------------------------------------------- 這是一個很全面的一個解釋了,就相當於一個比方,在一個屋子裏,每個人都擁有自己的桌子,然後此時快遞在外面排著隊進來,嚴格遵守排隊秩序,然後一個快遞來了之後,我們拆開看是否位自己需要的,如果需要的話就接受它,如果不需要的話另行處理(不是銷毀)。那麽在這段比喻中,每個人都是一個窗口,快遞就是消息,這裏的消息就是敲擊鍵盤,點擊鼠標等一系列外設動作,那麽這些消息按照隊列的數據結構進行排列,然後通過循環的方式讓每個窗口都能找到屬於自己的消息,這就是win32的消息機制。
關於一些小概念在這裏進行一下解釋
  1. 應用實例:應用只有一個,實例可以多個,比如qq一臺電腦只能裝一個,但可以點開多個窗口,此時多個窗口每個都是應用實例
  2. 句柄:類似於指針,保存的是地址,但是只能看內容,不能對其進行修改;
  3. 在創建窗口的過程中,屏幕的左上角為坐標原點,並且長度的單位,為像素;
  4. 前一個應用實例:比如通過微信打開qq,微信為qq的應用實例(區別於子窗口)
  5. 調用約定:是指當一個函數被調用時,函數的參數會被傳遞給被調用的函數和返回值會被返回給調用函數。函數的調用約定就是描述參數是怎麽傳遞和由誰平衡堆棧的,當然還有返回值

先放上來一個 利用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編程】