【SunXin.VC++深入】
1.窗口(Windows)和句柄(HANDLE,handle:窗口句柄(HWND)圖標(biāo)句柄(HICON)、光標(biāo)句柄(HCURSOR)和畫刷句柄(HBRUSH
2.消息,消息隊(duì)列,消息循環(huán),消息響應(yīng)
 .OS將操作包裝成Message
 .typedef struct MSG {       
      HWND   hwnd; //窗口句柄,即標(biāo)示消息所屬的窗口     
      UINT   message;//標(biāo)示消息的類別,是鼠標(biāo)還是鍵盤等 如鼠標(biāo)左鍵按下消息是WM_LBUTTONDOWN,鍵盤按下消息是WM_KEYDOWN,字符消息是WM_CHAR
      WPARAM wParam;//消息的附加信息
      LPARAM lParam;//消息的附加信息
      DWORD  time;//消息投遞到消息隊(duì)列中的時(shí)間
      POINT  pt;//鼠標(biāo)的當(dāng)前位置
   } MSG;
 .消息隊(duì)列,每一個(gè)Windows應(yīng)用程序開始執(zhí)行后,系統(tǒng)都會(huì)為該程序創(chuàng)建一個(gè)消息隊(duì)列,這個(gè)消息隊(duì)列用來(lái)存放該程序創(chuàng)建的窗口的消息
 .進(jìn)隊(duì)消息(OS將產(chǎn)生的消息放在應(yīng)用程序的消息隊(duì)列中,讓應(yīng)用程序來(lái)處理)
  不進(jìn)隊(duì)消息(OS直接調(diào)用窗口的處理過(guò)程)
 .Windows應(yīng)用程序的消息處理機(jī)制
  while(GetMessage(&msg,NULL,0,0)){//接收到WM_QUIT消息時(shí),才返回0
    
TranslateMessage(&msg);//對(duì)消息進(jìn)行包裝處理然后再以消息的形式投放到消息隊(duì)列
    
DispatchMessage(&msg);//消息回傳給操作系統(tǒng),由操作系統(tǒng)調(diào)用窗口過(guò)程函數(shù)對(duì)消息進(jìn)行處理
 
}

(1)操作系統(tǒng)接收到應(yīng)用程序的窗口消息,將消息投遞到該應(yīng)用程序的消息隊(duì)列中。
2)應(yīng)用程序在消息循環(huán)中調(diào)用GetMessage函數(shù)從消息隊(duì)列中取出一條條的消息。取出后,以對(duì)消息進(jìn)行一些預(yù)處理,如放棄對(duì)某些消息的響應(yīng),或者調(diào)用TranslateMessage產(chǎn)生新的消息
3)應(yīng)用程序調(diào)用DispatchMessage,將消息回傳給操作系統(tǒng)。消息是由MSG結(jié)構(gòu)體對(duì)象來(lái)表示的,其中就包含了接收消息的窗口的句柄。因此,DispatchMessage函數(shù)總能進(jìn)行正確的傳遞。4)系統(tǒng)利用WNDCLASS結(jié)構(gòu)體的lpfnWndProc成員保存的窗口過(guò)程函數(shù)的指針調(diào)用窗口過(guò)程,對(duì)消息進(jìn)行處理(即“系統(tǒng)給應(yīng)用程序發(fā)送了消息”)。
 .窗口過(guò)程函數(shù)
   lresult callback windowproc(

        hwnd hwnd,          // 對(duì)應(yīng)消息的窗口句柄

        uint umsg,           // 消息代碼,區(qū)別消息的類型

        wparam wparam,      // 消息代碼的附加參數(shù)1

        lparam lparam       // 消息代碼的附加參數(shù)2

       );
【蔡學(xué)鏞.揭開消息循環(huán)的神秘面紗】


簡(jiǎn)單歸納如下:
   訊息循環(huán)被封裝進(jìn)了 Application 類別的 Run() 靜態(tài)方法中;Windows Procedure 被封裝進(jìn)了 NativeWindow 與 Control 類別中;
個(gè)別的訊息處理動(dòng)作被封裝進(jìn) Control 類別的 OnXyz()(例如 OnPaint())。我們可以覆蓋(override)OnXyz(),來(lái)提供我們自己的程序。
也可以利用.NET的事件(event)機(jī)制,在 Xyz 事件上,加入我們的事件處理函式(Event Handler)。Control 類別的 OnXyz() 會(huì)主動(dòng)呼叫 Xyz 事件的處理函式。
請(qǐng)注意,因?yàn)?Xyz 的事件處理函式是由 Control 類別的 OnXyz() 方法所呼叫的,所以當(dāng)你覆寫 OnXyz() 方法時(shí),
不要忘了呼叫 Control 類別的 OnXyz()(除非你有特殊需求),否則 Xyz 事件處理函式將會(huì)沒(méi)有作用。
只要呼叫 base.OnXyz(),就可以呼叫到 Control 類別的 OnXyz() 方法
1. 在 Main() 中,利用 Application.Run() 來(lái)將 Form1 窗口顯示出來(lái),并進(jìn)入訊息循環(huán)。程序的執(zhí)行過(guò)程中,Application.Run() 一直未結(jié)束。
2. OS 在此 Process 的訊息隊(duì)列內(nèi)放進(jìn)一個(gè) WM_PAINT 訊息,好讓窗口被顯示出來(lái)。
3. WM_PAINT 被 Application.Run() 內(nèi)的訊息循環(huán)取出來(lái),發(fā)派到 WndProc()。由于多型(Polymorphism)的因素,此次調(diào)用(invoke)到的 WndProc() 是屬于    Form1 的 WndProc(),也就是上述程序中批注(comment)1 的地方,而不是調(diào)用到 Control.WndProc()。
4. 在 Form1.WndProc() 的最后,有調(diào)用 base.WndProc(),這實(shí)際上調(diào)用到 Control.WndProc()。
5. Control.WndProc() 從 Message 參數(shù)中得知此訊息是 WM_PAINT,于是調(diào)用 OnPaint()。由于多型的因素,此次調(diào)用到的 OnPaint() 是屬于 Form1 的 OnPaint(),也就是上述程序中批注 2 的地方,而不是調(diào)用到 Control.OnPaint()。
6. 在 Form1.OnPaint() 的最后,有調(diào)用 base.OnPaint(),這實(shí)際上調(diào)用到 Control.OnPaint()。
7. 我們?cè)?jīng)在 Form1 的建構(gòu)式(constructor)中將 Form1_Paint() 與 Form1_Paint2() 登記成為 Paint 事件處理函式(Event Handler)。Control.OnPaint() 會(huì)去依序去呼叫這兩個(gè)函式,也就是上述程序中批注 3 與 4 的地方。

【.NET Windows Message】
1.Control--Button,Form……
  protect vitrual WndProcess(ref Message);
    調(diào)用private Wm_(ref Message);//具體某類消息
      調(diào)用Oprotect virtual On_xx(EventArg e);//觸發(fā)相關(guān)事件
2.解釋事件冒泡:比如鍵盤消息可先由Form來(lái)處理,然后交由相關(guān)的Control來(lái)處理
3.解釋FormPaint:窗口的移動(dòng),最小化,最大話都會(huì)引起窗口內(nèi)容的重新Paint,OS產(chǎn)生一個(gè)相關(guān)消息發(fā)給應(yīng)用程序的消息隊(duì)列,應(yīng)用程序得到并處理消息時(shí)先是Form依次經(jīng)過(guò)Wn_Process,Wn_..,On_Paint,Form_Paint,之后Form中的每一個(gè)Control也會(huì)依次做重繪的工作