windos - 窗體程序

窗體線程又稱爲UI線程(User Interface Thread)它通過多種空間接收用戶輸入並顯示結果,UI線程執行消息循環任務:

  1. 循環查看消息隊列
  2. 獲得的消息匹配到函數事件
  3. 執行函數時間
    窗體程學的要素有窗體資源、消息隊列和循環結構,它負責接收用戶的輸入並進行結果顯示。

多窗體管理

常見的管理方法

窗體管理方法 特點
在窗體事件中新建其他窗體對象 方法最簡單,反覆創建銷燬浪費資源,容易產生數據衝突
使用公共類方法設置窗體顯示或隱藏 難度適中、切換靈活、線程控制複雜
派生ApplicationContext類,編寫窗體切換方法 編寫難度高、切換靈活

Windows窗體資源

程序的查個體對象顯示都基於桌面窗口對象,系統爲每個窗體資源對象分配唯一的句柄表示。窗體資源的關係有三種劃分方式:

  1. Z-order描述窗體顯示的前後關係
  2. 根據資源邏輯區域劃分成父子關係
  3. 代碼重用的窗體類間繼承關係
    桌面窗體是其他窗體的最頂級父窗體,內核函數GetDesktopWindow可獲取桌面窗體資源標識。

用戶輸入與消息機制

Windows 平臺具有兩種處理鍵鍵盤與鼠標輸入的方式,分別是消息機制直接輸入檢測方式

消息機制
消息取值功能劃分

消息取值範圍 功能說明
0~-x3FF 專由Windows操作系統使用
0x4FF~0x7FFF 用戶窗體類的自定義消息
0x800~0xBFFF 應用程序的自定義消息
0xC000~0xFFFF 應用程序的String消息
大於0xFFFF 系統保留

Windows 具有一個系統消息隊列按序存儲全部消息,並根據規則再將消息投放到進程的消息隊列中。系統爲每一個窗體對象創建一個消息隊列,消息經分配後由系統隊列進入到窗體隊列,每一個窗體對象配置一個窗體線程運行消息循環任務。消息循環反覆檢查消息隊列中的消息,根據消息指匹配執行相應的分支代碼。

Windows就有兩種先進先出的消息隊列,分別是系統消息隊列窗體對象消息隊列。消息可有系統自動派送,也可由程序主動向其他程序發送,發送方式有兩種,一種方式是將消息發送到先進先出的消息隊列結構中,這些消息也叫隊列化消息,用戶設備輸入消息等就屬於隊列化消息,一種方式是將消息直接發送到窗體函數中,這些消息叫非隊列化消息。

驅動程序將用戶的鍵盤與鼠標的輸入轉化爲消息結構放入系統消息隊列,消息被分派到當前激活的窗體線程,窗體消息處理函數對消息進行匹配。消息隊列是一個系統創建的內存對象,是動態變化的,應用程序會使用一個循環結構來處理消息隊列,在每次循環時都用到GetMessage和DispatchMessage函數,GetMesage函數從當前消息隊列前去除一個消息結構,DispatchMessage函數對消息進行匹配,使得系統去執行與消息對應的過程。而非隊列化的消息則是直接發送到了窗體過程,表示用戶激活了某個窗體。

消息機制是Windows操作系統的重要內核組成,Windows能夠爲每個窗體應用程序維護一個消息隊列。操作系統把用戶的輸入統一處理爲消息,派送到當前激活窗體,隱藏狀態的窗體不接收用戶輸入。 Windows僅有一個激活窗體,用戶通過鍵盤、鼠標產生的消息都i發送到激活窗體,最頂窗體與激活窗體有時是不同的窗體。

窗體消息重載

DefWindowsProc 函數又稱爲消息回調函數,它處於窗體線程的消息循環結構內,雖然每個消息僅對應一次匹配,但是耗時的操作還是會影響後續消息的接收入處理。消息回調函數是窗體程序特有的,Windows平臺還支持通用回調函數機制。

默認的消息處理函數僅處理系統消息,工作線程向窗體發送自定義消息是一種有效的通信方式,SendMessage與PostMessag方法可向特定窗體發送自定義消息。窗體相應自定義消息方式是對Form類的DefWndProc成員函數進行重載。

消息結構需要填充窗體對象的句柄值,內核函數FindWindow 查找特定窗體資源,EnumWindows函數能遍歷所有窗體對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章