<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設計應用 > MicroWindows體系結構及應用程序接口

MicroWindows體系結構及應用程序接口

作者: 時(shí)間:2004-12-07 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要:是一個(gè)著(zhù)名的開(kāi)放源碼的嵌入式GUI軟件。本文簡(jiǎn)要論述了的體系結構和,并介紹其設備驅動(dòng)特性、API、客戶(hù)機/服務(wù)器模型和畫(huà)圖機制。

關(guān)鍵詞: API Nano-X 圖形用戶(hù)界面

許多開(kāi)發(fā)者在嵌入式設計中開(kāi)始使用類(lèi)似于桌面的操作系統。其中一個(gè)方案就是Linux操作系統。由于Linux在嵌入式系統上具有桌面電腦的全部功能和特性,作為一種免費的開(kāi)放源碼,它允許修改和根據用戶(hù)的要求進(jìn)行定制。

MicroWindows是一個(gè)開(kāi)放源碼的嵌入式GUI軟件,目的是把圖形視窗環(huán)境引入到運行Linux的小型設備和平臺上。作為X Window系統的替代品,MicroWindows可以用更少的RAM和文件存儲空間(100KB~600KB)提供相似的功能,允許設計得輕松加入各種顯示設備、鼠標、觸摸屏和鍵盤(pán)等;可移植性非常好,可用C語(yǔ)言實(shí)現;支持Intel 16位/32位CPU、MIPS R4000以及基于A(yíng)RM內核的處理器芯片。

1 體系結構

1.1 分層結構設計

MicroWindows采用分層結構設計方法,在底層提供對屏幕、鼠標、觸摸屏和鍵盤(pán)的驅動(dòng),在程序能訪(fǎng)問(wèn)實(shí)際的硬件設備和其它用戶(hù)定制設備。在中間層有一個(gè)可移植圖形引擎,提供繪制線(xiàn)程、區域填充、繪制多邊形、裁減和使用顏色模式的方法。在頂層實(shí)現多種API以適應不同的應用環(huán)境。目前,MicroWindows中使用兩種流行的圖形編程:Microsoft Windows Win32/WinCE圖形顯示(GDI)和Xlib接口。前者應用于所有的Windows CE和Win32;后者就像Nano-X,應用于所有Linux X插件集的最底層,這樣可讓Linux圖形程序員X接口開(kāi)發(fā)圖形。

1.2 驅動(dòng)設備

device.h文件中定義設備驅動(dòng)接口。MicroWindows已實(shí)現至少將一個(gè)屏幕、鼠標和鍵盤(pán)的驅動(dòng)與系統相連。獨立圖形設備引擎的中間層可以使驅動(dòng)設備直接完成對硬件的具體操作。

(1)屏幕驅動(dòng)

MicroWindows可運行在支持Framebuffer的32位Linux系統上,也可使用SVGALib[45]庫來(lái)進(jìn)行圖形顯示。此外,還被移植到16位的ELKS和實(shí)模式的MSDOS上,實(shí)現1、2、4、8、16和32位的像素支持,以及實(shí)現VGA16平面模式支持。它的圖形引擎能夠運行在任何支持readpixel、writepixel、drawhorzline、drawvertline和setpalette的系統之上。如果底層驅動(dòng)系統實(shí)現了Blitting,則上層可提供更多的增強功能。在底層函數的支持之下,上層實(shí)現了對位圖、字體、光標以及顏色的支持。除了基于調色板的1、2、4和8位像素模式,也實(shí)現15、16和32位像素的真彩模式。

(2)鼠標驅動(dòng)

MicroWindows有三個(gè)鼠標驅動(dòng)程序。GPM驅動(dòng)程序mou_gpm.c支持Linux系統,串口鼠標驅動(dòng)程序mou_ser.c支持Linux和ELKS系統,int33驅動(dòng)程序mou_dos.c支持MSDOS系統。鼠標驅動(dòng)程序的基本功能,是將鼠標中的數據編碼,然后返回關(guān)于鼠標位置和按鍵的相對或絕對數據。

在Linux下,MicroWindows的主循環(huán)是select()聲明,如果運行的系統不支持select(),MicroWindows則提供Poll()入口。

(3)鍵盤(pán)驅動(dòng)

MicroWindows提供兩個(gè)鍵盤(pán)驅動(dòng)程序:Kbd_tty.c適用于Linux和ELKS系統,鍵盤(pán)被當成文件描述符來(lái)讀寫(xiě);Kbd_bios.c用于MSDOS真彩模式下,它是對PC BIOS進(jìn)行讀寫(xiě)來(lái)對按鍵進(jìn)行操作。

1.3 MicroGUI――獨立圖形設備引擎

MicroWindows的MicroGUI提供了對屏幕、鼠標、鍵盤(pán)驅動(dòng)程序和硬件之間的接口。用戶(hù)應用程序不能直接調用核心圖形引擎,但是可通過(guò)API函數來(lái)實(shí)現。核心程序在客戶(hù)機/服務(wù)器模型下常駐在服務(wù)器上,使用內部的文本字體和位圖文本模式。此外,核心程序使用的是指針,這樣不用靠轉變成句柄來(lái)實(shí)現更多的復雜功能。

MicroWindows中的核心程序以GdXXX()開(kāi)頭,與之相連的是圖形輸出系統而不是窗口管理系統。此外,還控制所有的裁剪和顏色轉換功能。以下是組成MicroWindows核心模塊的文件:

dvdraw.c――核心圖形程序,關(guān)于繪制線(xiàn)段、圓、多邊形及其填充,文本和位圖文件的繪制和顏色轉換;

devclip.c――核心裁剪程序;

devrgn.c――動(dòng)態(tài)分配程序;

devmouse.c――鼠標控制程序;

devkbd.c――核心鍵盤(pán)控制程序;

devpalX.c――連接到系統調色板。

1.4 應用程序接口

MicroWindows提供兩個(gè)應用程序接口:MicroWindows API(源代碼在win*.c中)和Nano_XAPI(源代碼在nanox*.c中)

在MicroWidows上的API函數的基本模型都是用來(lái)初始化屏幕、鍵盤(pán)和鼠標的驅動(dòng)程序,然后一直等待select()消息循環(huán)。當事件發(fā)生時(shí),這條信息將送到用戶(hù)程序。如果是用戶(hù)請求圖形操作,那參數將被編碼后送到適當的GdXXX核心程序上。與原始圖形操作相對的窗口概念是被該層所控制的,也就是說(shuō)該層的API函數定義了窗口及其對應系統的概念。這樣,系統坐標就能被轉成屏幕上顯示的坐標,并且可將數據傳給GdXXX核心程序,由其作實(shí)際操作。該層亦定義圖形/顯示文件,并且會(huì )將此信息包括裁減信息送到核心程序上。

MicroWindows API支持大多數圖形繪制、裁減、窗口工具條繪制以及拖拉窗口等這些程序。Nano_x API以mini-X服務(wù)器基礎,類(lèi)似于X的一個(gè)API,沿用X Window中的Xlib API,命名都是GrXXX()而不是X Windows中的X)。Nano-x API加入了基于網(wǎng)絡(luò )的客戶(hù)機/服務(wù)器功能,但是沒(méi)有實(shí)現窗口管理,所以對窗口的處理需要使用系統提供的一個(gè)插件(widget)集,或者完全由應用程序員自已開(kāi)發(fā)。

2 圖形引擎特性與實(shí)現

圖形引擎層的功能是完成圖形在實(shí)虛屏之間的轉換,以Gd...為開(kāi)頭,并將指針傳給PSD作為它的首個(gè)參數。PSD參數將指定底層的顯示模式,例如設備的垂直和水平尺寸、硬件使用的顏色模式。另外,真正執行畫(huà)圖的程序在這一層中作為功能指針使用。所有屏幕坐標都是COORD類(lèi)型。

顏色在圖形引擎中被指定RGB CILORVAL模式,然后被轉換成顏色指針,以PIXELVAL模式傳給顯示硬件,在32bpp(bit per pixel)真彩顯示器環(huán)境下不必轉換。

(1)區域

區域用來(lái)描述屏幕上像素點(diǎn)的分布。在MicroWindows中,區域是用一些無(wú)交迭的矩形組成的數組來(lái)描述的。目前實(shí)現區域有兩種方法,最初是用一個(gè)靜態(tài)數組CLIPRECTs來(lái)描述復雜區域。在這個(gè)數組中任一矩形中的點(diǎn)都被認為是存在這個(gè)區域中的,另一個(gè)全局變量clipcount用來(lái)給這個(gè)數組中的矩形計數。這個(gè)方法沒(méi)有給區域管理提供入口點(diǎn),所以整個(gè)數組的數據直接被送到負責裁剪功能的函數數口。新方法則可以創(chuàng )建任何數目的區域。用來(lái)描述區域的數組CLIPREGION被定義成動(dòng)態(tài)數據組,可動(dòng)態(tài)分配它所包含矩形的數量,這樣那些無(wú)交迭的矩形被存放在“y-x”類(lèi)型的隊列中。在同一隊列中,所有矩形的垂直高度y是一樣的,這意味著(zhù)在每個(gè)隊列中只有矩形的寬度可變。實(shí)際程序是利用Intersection、Union、Subtraction、Exclusive OR等方法來(lái)實(shí)現創(chuàng )建、刪除一個(gè)區域或者是將幾個(gè)區域或矩形合并。以下是這種方法設計的幾個(gè)函數。

GdAllocRegion 創(chuàng )建一個(gè)區域

GdDestroyRegion 刪除一個(gè)區域

GdCopyRegion 復制區域

GdUnionRectWithRegion 將一個(gè)矩形和一個(gè)區域合并

GdIntersectRegion 在兩個(gè)區域的交集處創(chuàng )建一個(gè)新區域

GdSubtractRegion 在兩個(gè)區域的差集處創(chuàng )建一個(gè)新區域

GdUnionRegion 在兩個(gè)區域的并集創(chuàng )建一個(gè)新區域

GdXorRegion

(2)裁剪

圖形引擎中有一個(gè)由圖形操作定義的由一些矩形組成的裁剪區,如果點(diǎn)被包含在這些裁減區內就會(huì )被繪制出來(lái)。有兩個(gè)裁剪算法:devclipl.c針對靜態(tài)矩形數組,devclipc2.c針對新的動(dòng)態(tài)數組。GdSetClipRects是唯一刪除區域并指定后來(lái)的圖形操作的入口點(diǎn)。所有的繪圖程序都要調用兩個(gè)附加程序來(lái)決定是否畫(huà)圖。GdClipPoint獲取屏幕坐標的(x,y)點(diǎn),如果該點(diǎn)被繪制出來(lái)的話(huà),則返回TRUE。GdClipArea獲取屏幕上方最左的或者下方最右的點(diǎn)并回以下值:CLIP_VISIBLE(指定區域在原區域內)、CLIP_INVISIBLE(指定區域不在原區域內)、CLIP_PARTIAL(指定區域部分在原區域內)。

(3)畫(huà)線(xiàn)

MicroWindows使用GdPoint畫(huà)點(diǎn),GdLine畫(huà)線(xiàn)。畫(huà)線(xiàn)時(shí)使用當前的前景色(DgSetForeground指定)。有兩種繪制模式:MODE_SET和MODE_COR。

(4)矩形、圓和橢圓以及多邊形

矩形、圓和橢圓的繪制分別調用GdRect和GdEllipse來(lái)實(shí)現。MicroWindows中定義了一個(gè)包含(x,y)多邊形頂點(diǎn)的數組來(lái)表示多邊形,調用GdLine函數畫(huà)線(xiàn),把這些點(diǎn)相連就可以實(shí)現畫(huà)多邊形。繪制時(shí)使用前景色。

(5)區域填充

MicroWindows中使用GdFillRect函數填充矩形區域,填充使用前景色。填充圓和橢圓使用GdFillEillpse函數,填充多邊形使用GdFillPoly函數。填充的實(shí)現是在屏幕驅動(dòng)中不斷地調用GrawHorzLine函數。

(6)字體和文本輸出

MicroWindows支持可變/不可變字體。文本輸出時(shí)使用GdSetFont定義輸出使用的字體,再調用GdText函數輸出。

(7)顏色模式和調色板

MicroWindows支持RGB顏色,顏色匹配,真彩和調色板顯示,3D效果的顯示。

(8)圖片繪制

MicroWindows支持兩種格式的圖片。單色圖片用IMAGEBITS結構(1表示前景色,0表示背景色)來(lái)定義,繪制時(shí)調用GdBitmap程序。彩色圖片可以分別定義為1、4、8 bpp的模式,用IMAGEHDR結構來(lái)表示。繪制時(shí)調用GdDrawImage函數。

(9)映射

映射功能在實(shí)虛屏的轉換中使用。GdBlit可以實(shí)現上層的API將虛擬內存存復制到顯示屏上,復制時(shí)調用GdBlit函數。

3 MicroWindows API

MicroWindows API中的基本通信機制是消息機制。一個(gè)消息機制中包含了message number和兩個(gè)參數:wParam、lParam。Message被存放在應用程序的message-queue中,GetMessage函數將其取出。WM_GHAR針對鍵盤(pán)輸入,WM_LBUTTONDOWN針對鼠標鍵被按下。窗口創(chuàng )建時(shí)使用WMCREATE,刪除時(shí)使用WM_DESTROY。DispatchMessage將消息傳到處理程序的窗口。

以下是處理消息的有關(guān)函數:

SendMessage 將消息傳到窗口

PostMessage 將消息傳到消息隊列

PostQuitMessage 傳遞WM_QUIT消息到消息隊列讀時(shí)中斷程序

GetMessage 得到消息后結束中斷

TranslateMessage 將按鍵按下/彈起的消息傳到WMCAR

DispatchMessage 將消息傳到為它分配的窗口程序

3.2 窗口的創(chuàng )建和刪除

RegisterClass 定義新的窗口類(lèi)型并啟動(dòng)窗口程序

UnRegisterClass 刪除窗口類(lèi)型

CreateWindowsEx 按窗口類(lèi)型創(chuàng )建一個(gè)窗口

DeatroyWindow 刪除一個(gè)窗口

窗口創(chuàng )建后產(chǎn)生WM_CREATE消息,刪除產(chǎn)生WM_DESTROY消息。

3.3 窗口的顯示、隱藏和移動(dòng)

ShowWindow函數指定窗口是否可見(jiàn)。MoveWindow改變窗口的位置和大小。窗口位置改變時(shí),產(chǎn)生WM_MOVE消息;窗口大小改變時(shí),產(chǎn)生WM_SIZE消息。

3.4 窗口的繪制

窗口繪制時(shí)產(chǎn)生WM_PAINT消息。窗口的標題欄自動(dòng)繪制,設置屬性使用SetWinowText,察看屬性使用GetWindowText。

(1)實(shí)虛屏切換

窗口繪制使用的坐標系統是屏幕上的絕對坐標系,MicroWindows API使用的是相對坐標系。GetClientRect和GetWindowRect函數各自返回虛屏和實(shí)屏的坐標值。

(2)Device Contexts

調用圖形API之間要包含device context。它指定系統所使用的窗口和坐標系,同時(shí)還定義系統默認的前景色和背景色。

GetDC用來(lái)包含device context。在畫(huà)標題欄還需調用GetWindowDC。GetDCEx定義子/兄弟窗口的裁剪操作。繪制結束時(shí)調用ReleaseDC釋放DC。

(3)圖形API

見(jiàn)網(wǎng)絡(luò )補充版(http://www.dpj.com.cn)

3.5 其它實(shí)用函數

WndSetDesktopWallpaper 設置桌面的背景圖片

WndSetCursor 為窗口創(chuàng )建光標

WndRaiseWindow 拉伸窗口

WndLowerWindow 縮小窗口

WndGetTopWindow 返回最上層窗口的句柄

Sleep 睡眠

(1)設置窗口中心

WM_SETFOCUS和WMKILLFOCUS分別用于獲取/刪除中心。GetActiveWindow返回ancestor窗口,GetDesktopWINDOW返回當前桌面窗口的句柄。

(2)鼠標捕獲

WM_MOUSEMOVE用來(lái)表示鼠標被移動(dòng)。SetCapture獲取全部的鼠標移動(dòng)信息,ReleaseCapture返回到程序,GetCaptrue返回到捕獲區域。

(3)區域管理

SetRect 定義一個(gè)矩形結構

SetRectEmpty 定義一個(gè)空矩形

CopyRect 復制一個(gè)矩形

IsRectEmpty 為空矩形時(shí)返回TRUE

InflateRect 放大矩形

OffsetRect 移動(dòng)矩形

PtInRect 判斷點(diǎn)是否在矩形區內

4 Nano-X API

(1)Client/Server模型

Nano-X允許應用程序使用Client/Server網(wǎng)絡(luò )協(xié)議或本地UNIX Domain Socket,可讓幾個(gè)應用程序運行在嵌入式設備或遠端主機上,并連接到Server上顯示出來(lái)。

(2)窗口的創(chuàng )建和刪除

Nan0-X中使用GrNewWindow創(chuàng )建窗口。GrNewInputWindow定義窗口只允許用來(lái)輸入。函數定義了窗口的邊界和顏色。

(3)窗口的顯示、隱藏和移動(dòng)

GrMapWindow用來(lái)顯示窗口,GrUnmapWindow用來(lái)隱藏,GrRaiseWindow用來(lái)拉伸,GrLowerWindow用來(lái)縮小,GrMoveWindow用來(lái)移動(dòng),GrResizeWindow用來(lái)改變窗口大小。

(4)窗口中的繪制

①Graphics Context。GrNewGC用來(lái)分配graphics Context,刪除時(shí)使用GrDestroyGC,GrCopyGC用來(lái)復制。創(chuàng )建一個(gè)Graphics Context后,服務(wù)器返回一個(gè)Graphics Context的ID,用來(lái)作為API的參數。GC中不存放裁剪區和系統坐標系。

②繪圖API。見(jiàn)補充版(http://www.dpj.com.cn)。



關(guān)鍵詞: MicroWindows 應用程序 接口

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>