首頁 > 文章中心 > 正文

          用戶界面設(shè)計

          前言:本站為你精心整理了用戶界面設(shè)計范文,希望能為你的創(chuàng)作提供參考價值,我們的客服老師可以幫助你提供個性化的參考范文,歡迎咨詢。

          摘要該文從軟件可移植性的角度指出設(shè)計256色圖形用戶界面時應(yīng)當注意的問題,在對SuperVGA產(chǎn)品進行分析的基礎(chǔ)上,提出了基于表格驅(qū)動的程序設(shè)計思想,并給出了范例。

          隨著各種超級VGA的出現(xiàn),同時具有高分辨率和豐富色彩的圖形用戶界面已經(jīng)成為程序員和用戶共同追求的目標。然而由于各制造商提供的VGA產(chǎn)品之間的差異,使得高分辨率256色圖形界面的兼容性受到影響,常常會出現(xiàn)這樣的情況:在一個顯示系統(tǒng)下運行良好的程序,在另一種顯示系統(tǒng)下變得面目全非,甚至根本不顯示。這表明程序員對程序的可移植性重視不夠,或?qū)Ω鞣N顯示設(shè)備缺乏足夠的了解。

          軟件的可移植性是指軟件產(chǎn)品從一個硬件/軟件環(huán)境轉(zhuǎn)移到另一個硬件/軟件環(huán)境的難易與繁簡程度。它從軟件對新環(huán)境的適應(yīng)性這一方面,反映了軟件的質(zhì)量。為了提高軟件的可移植性,應(yīng)盡量使軟件與具體的設(shè)備無關(guān),即提高軟件的設(shè)備獨立性。對于256色圖形界面而言,就是要使程序不依賴于某種特定的顯示器。例如,程序員沒有任何理由假定用戶使用的是TVGA。為此,程序員必須提供顯示卡的常規(guī)檢測例程,并能根據(jù)檢測的結(jié)果決定圖形算法的具體實現(xiàn)。

          提高軟件設(shè)備獨立性的方法有很多,表格驅(qū)動就是其中一種。所謂表格,就是根據(jù)需要設(shè)計的數(shù)據(jù)結(jié)構(gòu)。表格中的數(shù)據(jù)由檢測例程填寫。表格中包含哪些欄目,應(yīng)在對各制造商提供的SuperVGA產(chǎn)品足夠了解的基礎(chǔ)上取舍,欄目應(yīng)體現(xiàn)各產(chǎn)品之間的差異。

          一、SuperVGA編程綜述

          SuperVGA產(chǎn)品在體系結(jié)構(gòu)上和標準的IBMVGA有所不同。但編程思想基本上是一樣的,這些編程方法已有許多文章介紹,這里不再重復(fù)。

          影響256色圖形界面可移植性的主要障礙來自各制造商提供的VGA產(chǎn)品的下面幾點差異。

          1.顯示模式的定義不同。如5DH對TVGA而言,代表640×480

          ×256色模式,對PVGA而言卻代

          表1024×768×16色模式。因此,直接用這種模式號初始化顯示系統(tǒng)是不可取的。和顯示模式密切相關(guān)的是水平分辨率和垂直分辨率。盡管各VGA的256色顯示模式定義迥異,但大都支持如下幾種流行的分辨率,現(xiàn)用統(tǒng)一的模式號定義見附表。

          @@10A06500.GIF;附表@@

          不同分辨率之間的區(qū)別,體現(xiàn)在編程上就是同一屏幕坐標映射到顯存的地址不同,但映射機理卻是一樣的。具體地說,坐標(x,y)對應(yīng)顯存的偏移地址(相對于A000)為Addr=-vga-width*y+x

          2.分頁機制不同。SuperVGA使用256K、512K或1M

          的顯示存儲器結(jié)構(gòu)。為了使處理器可通過一個64K主窗口來存取這樣大的顯示存儲器,SuperVGA有一個存儲器分頁機制,使得只將顯示存儲器的一部分映射到處理器的地址空間。值得注意的是,不同的VGA產(chǎn)品,其頁的大小不同,頁起始地址的粒度也是可變的。具體的頁選擇算法請查閱制造商提供的資料。

          不同的顯示模式,顯示一屏圖像所需的頁數(shù)是不同的。

          除了可移植性外,效率也是一個不可忽視的因素。圖形系統(tǒng)的核心部分應(yīng)使用匯編語言編程。這不僅是因為匯編語言的效率高,而且還因為匯編語言子程序的可再用性和可協(xié)用性也很好。核心部分應(yīng)十分重視下面幾點:(1)減少不必要的頁邊界檢查次數(shù);(2)只有在必要時才進行頁選擇;(3)選擇高效的機器指令。現(xiàn)舉例說明。程序1是圖像顯示系統(tǒng)中常用的函數(shù),其功能是將解包后的圖像數(shù)據(jù)送到顯存。為便于閱讀同時給出了C語言調(diào)用原型。程序在傳送每一行數(shù)據(jù)時,提前預(yù)測是否會遇到頁邊界,如果沒有,直接傳送;如果有,則將數(shù)據(jù)分成兩部分,分別傳送,中間插入頁選擇。所有的傳送均用字操作代替字節(jié)操作。頁邊界檢查只有一次,分頁操作只有在必要時才發(fā)生,圖像的顯示用最高效的指令REPMOVSW。

          程度1:

          ;原型:voidLineDump(intx,inty,intnum,charfar*ptr)

          ;參數(shù):

          ;x,y-屏幕坐標

          ;num-本行的像素個數(shù)

          ;ptr-指向像素數(shù)據(jù)的遠指針

          LineDumpprocfar

          pushbp

          movbp,sp

          subsp,2;WORDReservedforlocalvar.

          pushds

          pushes

          pushsi

          pushdi

          reservedequ[bp-2];Localvar.saveseg(DGROUP)

          xequ[bp+6];LargeModel

          yequ[bp+8]

          numequ[bp+10]

          offsequ[bp+12]

          psegequ[bp+14]

          movreserved,ds

          movds,pseg

          movsi,offs;DS:SI圖像數(shù)據(jù)所在源地址

          movax,0a000h;顯存段址

          moves,ax;ES:DI顯存目的地址

          movax,y

          pushds

          movds,reserved

          mulwordptrDGROUP:-vga-width

          popds

          addax,x

          adcdx,0

          movdi,ax;DI=-vga-width*y+x

          movah,dl;進位部分(DL)=頁號

          calldwordptrcs:-PageSelect

          movcx,num;本行要傳送字節(jié)數(shù)

          movbx,cx

          addbx,di;檢測傳送是否在一個頁內(nèi)

          jncDump-In-One-Page

          subcx,bx;CX=本頁字節(jié)數(shù),BX=下頁字節(jié)數(shù)

          shrcx,1;CX/2=字數(shù)

          repmovsw;本頁內(nèi)的傳送

          adccx,0

          repmovsb;處理可能的奇數(shù)字節(jié)數(shù)

          incah;調(diào)整頁號

          calldwordptrcs:-PageSelect

          movcx,bx;新頁內(nèi)要寫的字節(jié)數(shù)

          jcxzDump-Done

          Dump-In-One-Page:

          shrcx,1;CX/2=字數(shù)

          repmovsw;圖像傳送

          adccx,0

          repmovsb;處理可能的奇數(shù)字節(jié)數(shù)

          Dump-Done:

          popdi

          popsi

          popes

          popds

          movsp,bp

          popbp

          ret

          LineDumpendp

          二、表格驅(qū)動的基本思想

          根據(jù)上面的分析,用以驅(qū)動顯示系統(tǒng)的表格,至少應(yīng)當包含下列項目:

          (1)實際顯示模式:vga-mode

          (2)水平分辨率:vga-width

          (3)垂直分辨率:vga-depth

          (4)頁選擇例程的入口地址:PageSelect

          (5)當前顯示方式所使用的最大頁號:vga-pages

          這個表格由圖形初始化例程來填寫。圖形初始化例程接收的顯示模式是統(tǒng)一的模式號,這樣可以撇開具體的設(shè)備,如InitVGA(TVGA800×600)。該例程調(diào)用顯示設(shè)備檢測程序DetectVGA來判斷顯示器的類型,從而填寫表格中的各欄目,并初始化圖形系統(tǒng)為所需的圖形方式。所有圖形算法都要查此表。

          除了用上述方法來實現(xiàn)兼容外,視頻電子學(xué)標準協(xié)會(VESA)為我們提供了另一種方法。

          VESA

          提供了一組附加的BIOS功能,這組功能以標準的方式訪問SuperVGA擴充的模式。VESA的附加功能都是通過BIOS中斷10H的4FH功能來實現(xiàn)的。VESA的子功能01能返回非常有用的SuperVGA模式信息,包括分頁例程的地址。

          因此,程序員可以按照VESA的標準來編寫圖形系統(tǒng),這樣的程序可以在所有支持VESA的顯示器上運行。由于VESA包括了世界上的主要VGA供應(yīng)商,寫出來的程序可移植性是很好的。但是,其效率卻可能是最低的。所以最好采用一種折衷的辦法,對于熟悉的產(chǎn)品,可以不用VESA的功能,對于不熟悉(資料不全)或檢測不出來的顯示器嘗試用VESA提供的手段來編程,當然要檢測顯示設(shè)備是否支持VESA。

          有時出于某種考慮,不希望支持所有顯示設(shè)備的代碼集中在一個程序中,可以為每個顯示設(shè)備分別提供驅(qū)動模塊,主程序根據(jù)檢測的結(jié)果選擇一個合適的模塊加載。Borland的C++就是這樣,它有一套BGI驅(qū)動程序,各驅(qū)動程序提供統(tǒng)一的圖形函數(shù)接口。筆者在實際工作中,為每一種顯示設(shè)備編寫了一個256色的BGI格式的驅(qū)動程序,這樣,在編寫圖形系統(tǒng)時,再也沒有必要考慮用戶的實際顯示設(shè)備了。

          三、范例

          本文附有兩個圖形顯示的例子。ShowGif能顯示16/256色GIF格式圖像,能以任何256色模式啟動,支持多種顯示器。圖像可以漫游,并可隨時通過按鍵切換顯示方式。Main則是一個BGI驅(qū)動的鼠標/鍵盤控制的256色漢字圖形菜單。它自己會挑選一個合適的BGI,也可以從命令行指定一個BGI(比如指定VESA256給TVGA顯示器)。

          限于篇幅,這里僅給出有關(guān)的數(shù)據(jù)結(jié)構(gòu)和部分函數(shù)的說明(程序2)。然后給出一個初始化顯

          示系統(tǒng)的C語言片斷(程序3)。

          程序2(TVGA256.H):

          /*統(tǒng)一的模式集*/

          enumTVGA-MODE

          TVGA320x200=0,

          TVGA640x400=1,

          TVGA640x480=2,

          TVGA800x600=3,

          TVGA1024x768=4,

          ;

          voidTVGA256-driver(void);

          voidPVGA256-driver(void);

          voidAVGA256-driver(void);

          ...

          voidVESA256-driver(void);

          externintfar-CdeclTVGA256-driver-far[];

          externintfar-CdeclPVGA256-driver-far[];

          externintfar-CdeclAVGA256-driver-far[];

          ...

          externintfar-CdeclVESA256-driver-far[];

          /*支持的VGA集合*/

          enumVGAs{

          UnKnownVGA,

          TridentVGA,

          ParadiseVGA,

          AheadVGA,

          ...

          VesaVGA

          };

          /*對應(yīng)的BGI驅(qū)動程序名*/

          unsignedchar*Drivers[]={

          "TVGA256",

          "TVGA256",

          "AVGA256",

          ...

          "VESA256",

          };

          externintDetectVGA(void);

          /*功能:檢測顯示卡的型號

          返回值:0-Unknowm1-TridentVGA2-ParadiseVGA

          ...

          x-不能檢測出的VGA,但支持VESA

          返回值同時寫入全局變量vga-type*/

          externintVesaFound(void);

          /*功能:檢測VESABIOS的存在性

          返回:0-不支持VESA;

          其它-VESA版本號(0x0102即1.02版);

          返回值同時寫入全程變量vesa-found.*/

          externvoidInitVesa(void);

          /*功能:初始化VESA.根據(jù)-vga-mode模式號換算成VESA的標準模式號填寫頁粒度(WinGranularity),頁大小(WinSize),

          和分頁例程的入口地址(WinFuncPtr)

          VESA的標準模式解釋如下:

          100h-640x400256

          101h-640x480256

          102h-800x60016

          103h-800x600256

          104h-1024x76816

          105h-1024x768256etc.

          InitVesa供給InitVGA調(diào)用*/

          externvoidInitVGA(intmode);

          /*功能:初始化顯示系統(tǒng)(自動調(diào)用DetectVGA檢測顯示卡)

          參數(shù):mode=TVGA320x200(0)

          TVGA640x400(1)

          TVGA640x480(2)

          TVGA800x600(3)

          TVGA1024x768(4)

          返回:InitVGA沒有顯式的返回值,但它初始化下列全程變量:

          vga-mode,vga-width,vga-depth,vga-pages,PageSelect

          必要時自動調(diào)用InitVesa

          */

          externintvga-type;

          externintvga-mode;

          externintvga-width;

          externintvga-depth;

          externintvga-pages;

          externintvga-pages;

          externcharpage-number;

          externintvesa-found;

          ...

          程序3(初始化顯示系統(tǒng)的程序片斷):

          ...

          intGraphDriver,GraphMode;

          unsignedchar*bgiDriver="PVGA256";

          bgiDriver=Drivers[DetectVGA()];

          GraphDriver=installuserdriver(bgiDriver,NULL);

          GraphMode=TVGA800x600;

          initgraph(&GraphDriver,&GraphMode,"");...

          參考文獻

          1來文占等編譯.SuperVGA高級編程指南.北京:北京科海培訓(xùn)中心,1991.5.

          2張一波編譯.SuperVGA與VESA編程指南.北京:海洋出版社,1992.

          文檔上傳者

          相關(guān)期刊

          儀器儀表用戶

          省級期刊 審核時間1個月內(nèi)

          天津中環(huán)電子信息集團有限公司

          數(shù)字化用戶

          省級期刊 審核時間1個月內(nèi)

          四川省科學(xué)技術(shù)協(xié)會

          中國計算機用戶

          省級期刊 審核時間1個月內(nèi)

          中國電子信息產(chǎn)業(yè)發(fā)展研究院 北京中電報科技發(fā)展有限公司