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