ARM平臺的Microwindows圖形編程
設備無關的圖形引擎層
Microwindows系統中最核心的圖形函數是在圖形引擎層通過調用下層的硬件設備驅動程序實現的。用戶應用程序通常不直接調用引擎層的例程,而是調用最上層所提供的編程接口。將核心的圖形引擎例程獨立于應用程序接口主要是基于以下考慮:核心的例程在Client/Server環境中總是駐留在Server端,這些例程調用的位圖與文字格式經過優化處理,使得執行速度更快,所以這些格式通常與應用程序所使用的不同。另外,核心例程常使用指針以產生更復雜高效但邏輯性較差的代碼,而不是采用應用程序通常使用的ID號。在Microwindows的源代碼中,核心的例程通常包含在Devdraw.c、Devclip.c、Devmouse.c、Devkbd.c和DevpalX.c文件中:
設備上下文
應用程序必須在調用圖形繪制API函數前設置設備上下文。一些信息如目前采用的坐標系統、當前窗口在程序執行過程中相當長的時間內是不變的,所以沒有必要傳遞給每一個調用的函數,因而可以通過設備上下文的設置,將這些相對持久的信息通知系統。同時,如當前前景色、當前背景色等很多屬性也應在設備上下文中設置。可以通過調用GetDC來得到目前的設備上下文,當結束一系列繪制以后,調用ReleaseDC函數釋放DC對象。
消息傳遞機制
在Microwindows API之間最基本的通訊機制是消息傳遞。一個消息包含有一個約定的消息號、兩個參數:wParam和lParam。消息被存儲在應用程序的消息隊列中,可以通過調用函數GetMessage()獲取。當等待消息時,應用程序被阻塞。一些消息和硬件事件相關,如WM_CHAR代表鍵盤輸入、WM_LBUTTONDOWN代表鼠標左鍵按下。同時,窗口的創建與消除事件分別對應WM_CREAT和WM_DESTROY消息。在通常情況下,每個消息都對應于一個用HWND標識的窗口。在獲取消息后,應用程序通過調用DispatchMessage()將消息分派到所對應的窗口進行處理。當窗口建立時,該窗口所對應的各種消息的處理函數同時被定義,所以系統知道向哪一窗口傳遞消息。 消息傳遞機制允許核心的API通過對應各種事件的消息傳遞來實現各種功能,如窗口的創建,繪制,移動等等。通常情況下,相關的窗口操作消息都由DefWindowsProc函數來進行默認的處理,這樣就使得所有窗口的動作在行為上具有一致性,當某一窗口需要特殊的操作時,用戶可以通過改寫處理程序來滿足要求。 可直接處理消息的函數包括SendMessage、PostMessage、PostQuitMessage、GetMessage和DispatchMessage。
窗口的創建和消除
一個Microwindows應用程序的入口點是WinMain函數,而不是通常情況下的Main()。在Microwindows API中,最基本的顯示單元是窗口,窗口定義了一個顯示區域和與其相關的各種消息的處理函數。可以通過預定的類型,如按鍵(button)、文本框(editboxs)等來定制窗口,同時也可以由用戶定義特殊的類型。無論通過什么方式定義類型,創建窗口和消息通訊的方法是相同的。與創建和消除窗口相關的函數有RegisterClass、UnRegisterClass、CerateWindowEx、DestroyWindow、GetWindowLong和SETWindowLong。
窗口的顯示和移動
ShowWindow函數允許設備窗口屬性為可視或者隱藏。該屬性也可以在窗口創建的過程中由CreateWindowEx實現。窗口的移動包括窗口位置或者大小的變化。當窗口位置改變時,系統發送WM_MOVE消息;當窗口大小改變時,系統發送WM_SIZE消息。
窗口繪制
在其它窗口發生移動,導致某一窗口需要被繪制或重新繪制時,Microwindows系統會發送WM_PAINT消息給相關的窗口過程。這時,由應用程序決定調用圖形操作函數來繪制窗口。Micro windows為每個窗口維護一個UPDATE域,當UPDATE非空時就向窗口發送WM_PAINT消息。為了速度方面考慮,WM_PAINT消息只在應用程序隊列里沒有其它消息的情況下才會發送,這保證了應用程序對窗口的重繪可以一步完成,而不會被分割成好多步驟。如果不希望等待,可以調用UPDATEWindow函數強制進行窗口重繪。
窗口區域和絕對坐標
每一個窗口在顯示屏上繪制時,都應參照顯示屏像素點的絕對坐標進行。Microwindows API允許應用程序編程人員在窗口中不包括標題欄的區域內使用以窗口左上角為基準的相對坐標,這部分區域稱為客戶區域。GetClientRect函數和GetWindowRect函數將返回客戶區域和窗口的絕對坐標。ClientTo Screen函數和ScreenToClient函數則完成絕對坐標與相對坐標之間的相互轉換。
結語
通過將Microwindows移植到ARM平臺,在保持對系統資源低消耗的同時,在基于ARM的嵌入式系統中實現了類似X Windows桌面系統的友好圖形用戶界面。熟悉圖形應用程序的用戶可以在該系統上編寫自己的圖形應用程序。在未來的嵌入式系統設計中,Microwindows將發揮更大的作用。
評論