消息、句柄和窗口
一,為什么我要花時間研究這些東西
對于我個人來說我不想做碼農,不想只知道拖控件,使用控件有的時候要了解一下底層,不知道你們有沒有想過這樣的一個問題,我們在C#中使用的的event事件是怎么觸發這個事件呢?事件無非就是對委托的封裝,在類內不管用public還是protected進行修飾,再類外都是private,只能在類外+=或者-=對事件進行注冊或者注銷。這能說明什么呢?這只能說明你已經將事件進行了綁定,說白了就是將方法的地址使用一種參數的形式進行了傳遞,從一個類傳遞到另一個類中,然后對這個方法進行實現。如果我們建一個Windows應用程序的時候,我們在重繪窗口是會復寫函數Onpaint(),復寫之后這個方法又是怎樣進行控制的呢?
二、原因何在?
Windows應用程序是事件驅動的,也就是說,Windows應用程序將等待系統傳遞輸入,然后,應用程序的對輸入作出響應,將控件返回到系統上。系統和應用程序通過“Windows消息”通信。無論何時用戶移動鼠標或者單擊鍵盤時,系統就將消息發送到應用程序。應用程序有一個特殊的函數(稱為“窗口過程”)處理所接受的信息,以使對用戶的輸入作出響應。這個函數傳統上稱WndProc(),一般不必這樣稱呼它。可是,用戶交互作用并不只是創建應用程序要處理的消息,另一個示例是電源管理。恰好系統進入休眠模式之前,將消息發送到所有開放應用程序。如果應用程序并不準備進入休眠模式,他可以將消息發送回系統,說“此時不要進入睡眠模式”
消息路由有兩種類型。一種是將消息發送到稱為消息隊列的“先進先出”隊列中。對于所創建的每個用戶界面線程來說,有一個系統消息隊列和一個特定線程隊列。當用戶移動鼠標是,相關信息放到系統消息隊列中。系統檢查該消息,以確定建議那個窗體處理該消息,然后將消息發送到窗口的WndProc()函數進行處理。鼠標和鍵盤消息就是排隊消息的示例。路由消息的其他方式,系統將消息直接發送到窗口過程中。通常情況下會發送不排隊消息通知直接影響窗口的事件。諸如重新設置大小以及窗口激活類的消息,將一部排隊消息的形式發送。
每個應用程序可能由幾個窗體或者窗口組成。每個窗口都有一個窗口過程,來處理發送給它的消息。窗口過程將檢查每條消息,確定對消息進行哪些處理工作。將消息發送到窗口過程的進程,稱作“消息泵”。消息泵位于WinMain()函數中,二WinMain()是應用程序的入口點(類似于C#中的Main()方法)。消息有兩種類型:系統定義的消息和應用程序定義的消息。系統定義的消息是系統預定義的消息。應用程序定義的消息當然由應用程序定義。為了標示消息,有四個參數與他一起發送
1.窗口句柄
2.消息標識符
3.兩個消息參數值,通常稱作lParam和wParam
窗口句柄是一個long型的值,用于操作系統標示特殊的窗口。所創建的每個窗口都有一個句柄與它相關聯,這種句柄有時稱作hWnd。hWnd是在創建該窗口時由系統產生的,只要該窗口不被銷毀,它就保持為常量該消息所發送的句柄,是該消息窗口的句柄。
消息標識符是一個標識消息內同的指定變量。所處理的常見消息是WM_PAINT消息。這是一個系統定義的消息,告訴該窗口它要重新繪制其自身。系統定義的消息分為30個不同的類別。每個類別都是由該消息的兩個或者三個字符前綴定義的。就WM_PAINT消息而言,WM表示普通的窗口消息。其他類別包括用于編輯控件的EM、用于常用對話框的CDM,一集用于選項卡空間的TCM。每個消息標識符都是有一個在Windows SDK 中定義的相應符號標識符。
lParam和wParam這兩個消息參數幾乎可以包含任何事物。他們可以包括位標志、整型值、對象引用、結構引用、對于回調函數的引用等。如果消息不使用參數,一般就將其設置為null。
?
?