[翻譯]-WinCE 程序設計 (3rd 版)--1.5 Windows應用程序剖析

Windows應用程序剖析
基於Windows的編程遠不同於基於MS-DOS或Unix的編程。只要是程序需要,任何時候基於MS-DOS或Unix的程序都可以使用getc-或putc風格的函數從鍵盤讀取字符並寫到屏幕上。這是MS-DOS或Unix程序所使用的典型的"Pull"(拉)風格,這種風格是面向過程的,而一個Windows程序,則使用"Push"(推)模式。在這種模式下,必須編寫程序來響應來自操作系統的通知,比如一個鍵被壓下去了或者收到一個重繪屏幕的命令。

Windows應用程序並不從操作系統請求輸入,而是由操作系統通知應用程序輸入產生了。操作系統通過發送消息(messages)給應用程序窗口來完成這些通知。所有窗口都是窗口類的具體實例。在進一步深入之前,讓我們先確保理解這些術語。

窗口類
窗口是屏幕上的一個區域,除了特殊情況,基本上都是矩形。窗口有一些基本參數,比如位置參數--x,y和z(窗口在屏幕其它窗口之上或者之下)--可視性以及層次關係--窗口與系統桌面形成父子窗口關係,系統桌面也是一個窗口。

每個被創建的窗口都是窗口類的一個具體實例。窗口類是一個模板,爲該類的所有窗口定義了許多共同屬性。換句話說,屬於同一個類的窗口有同樣的屬性。這些共享的屬性中最重要的是窗口過程。

窗口過程
窗口類裏窗口過程中的代碼定義了同一個類裏所有窗口的行爲。窗口過程處理髮到窗口的所有通知和請求。這些通知,要麼是操作系統發給窗口,告訴窗口有事件發生,窗口必須迴應,要麼是其他窗口發來的,向該窗口查詢信息。

這些通知是以消息的形式發送的。消息實際就是對窗口過程的一次調用,帶有參數指出通知或者查詢的種類。當有事件發生,例如窗口被移動、被改變大小或有鍵被按下去等,就會發送消息。標識消息的值由Windows定義。應用程序使用預定義好的常量,例如WM_CREATE和 WM_MOVE,來表示消息。因爲有很多消息可被髮送,所以當窗口類對某個消息沒有特殊處理的必要時,Windows提供了一個默認處理函數來處理傳遞這些消息。

消息生命週期
讓我們回頭一會,看一下Windows是如何協調發到系統裏各個窗口的各種消息的。Windows監視系統的所有輸入,例如鍵盤、鼠標、觸摸屏以及其它可以產生影響窗口的事件的硬件。當事件發生後,消息就被構成並定向給特定的窗口。Windows沒有直接調用窗口過程,而是加了一箇中間步驟。消息被放到擁有該窗口的應用程序的消息隊列裏了。當應用程序準備接收消息的時候,它把消息從隊列裏取出來,並告訴Windows發送該消息到應用程序適當的窗口上。

你可能會認爲這個過程中涉及許多中間步驟,那麼你是對的。就讓我們分解一下這個過程吧。
1、當事件發生,Windows就構成一個消息並放到擁有目的窗口的應用程序的消息隊列裏。和在XP裏一樣,在Windows CE中,每個應用程序有自己單獨的消息隊列[1] (這與Windows3.1及更早的Windows版本不同,那時只有唯一一個系統範圍內的消息隊列)。事件發生及構成一個消息都要比應用程序處理它們的速度快。雖然程序最好能快速響應或者用戶希望看到應用程序快速響應,但是隊列允許應用程序按自己的速率處理消息。消息隊列允許Windows在運做中設置一個通知並繼續完成其它任務,而不是僅僅限制在只響應收到消息的這個應用程序。

2、應用程序把消息從消息隊列中移出來,並回調Windows來分派消息。似乎很奇怪應用程序從隊列裏獲得消息卻只是簡單的回調Windows來處理這個消息,對這種方式,解釋如下:應用程序從隊列裏獲取消息,這使得應用程序在請求Windows把消息分派到相應窗口之前,可以預處理這些消息。許多情況下,應用程序會調用Windows裏不同的函數來處理具體的各種消息。

3、Windows分發消息,更確切的說,是Windows調用相應的窗口過程。沒有讓應用程序直接調用窗口過程,而是間接調用,這允許Windows協調這個窗口過程的調用與系統裏的其它事件。雖然此刻消息並不在另外一個隊列裏,但Windows在調用窗口過程之前,可能需要做一些預處理。但無論如何,這種調度方式減少了應用程序的責任,不用程序去決定適當的目的窗口,而是由Windows負責了。

4、窗口過程處理消息。所有的窗口過程都有相同的調用參數:被調用的窗口實例的句柄、消息參數、兩個普通參數,包含與消息相關的數據。窗口過程用窗口句柄區分窗口的每個實例。消息參數,指明窗口必須響應的事件。兩個普通包含與消息相關的數據。例如,WM_MOVE消息指出窗口將被移動,其中一個普通參數指向一個包含窗口新座標的結構。

注:技術上,Windows CE應用程序的每個線程都有一個消息隊列。稍後我將在本書裏討論線程。

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