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