一 前言
用戶界面是一個(gè)應(yīng)用程序最重要的部分,對(duì)用戶而言,界面就是應(yīng)用程序,他們感覺不到幕后正在執(zhí)行的代碼。不論花多少時(shí)間和精力來編制和優(yōu)化代碼,應(yīng)用程序的可用性仍然在很大程度上依賴于界面的好壞。第一步就設(shè)計(jì)出非常完美的界面是十分困難的,它需要在用戶的參與下進(jìn)行多次反復(fù)。要想設(shè)計(jì)出讓用戶滿意的界面,首先要知道什么是好的界面,針對(duì)自己要開發(fā)的應(yīng)用程序做出初步規(guī)劃設(shè)計(jì)。
二 界面設(shè)計(jì)初步規(guī)劃
設(shè)計(jì)用戶界面之前,先參照 Microsoft 或其他公司的一些應(yīng)用程序。在這個(gè)過程中,我們會(huì)發(fā)現(xiàn)許多通用的東西,比如:工具欄、狀態(tài)條、工具提示、上下文菜單以及標(biāo)記對(duì)話框。同時(shí)也要憑借自己使用軟件的經(jīng)驗(yàn),想一想曾經(jīng)使用過的一些界面好的應(yīng)用程序,哪些可以吸收利用。但要記住個(gè)人的喜好不等于用戶的喜好,必須把用戶的意見和需求吸收近來。眾所周知,用戶參與設(shè)計(jì)過程的時(shí)間越早,設(shè)計(jì)人員所花的時(shí)間和精力就越少,創(chuàng)建的界面就越好、越實(shí)用。
設(shè)計(jì)一個(gè)應(yīng)用程序界面時(shí),應(yīng)該先對(duì)整個(gè)系統(tǒng)界面進(jìn)行初步規(guī)劃??紤]應(yīng)該使用單文檔還是多文檔樣式?需要多少個(gè)不同的窗體?菜單中將包含什么命令?要不要使用工具欄重復(fù)菜單的功能?提供什么對(duì)話框與用戶交互?需要提供什么樣的幫助?
界面設(shè)計(jì)也需要考慮應(yīng)用程序的目的是什么、預(yù)期的用戶是誰等問題。經(jīng)常使用的應(yīng)用程序和偶爾使用的輔助程序要區(qū)別對(duì)待,用來顯示信息的應(yīng)用程序與用來收集信息的應(yīng)用程序也有應(yīng)所不同。目標(biāo)是針對(duì)初學(xué)者的應(yīng)用程序,界面設(shè)計(jì)要求簡單明了,而針對(duì)有經(jīng)驗(yàn)用戶卻可以復(fù)雜一些。如果系統(tǒng)計(jì)劃發(fā)布到全球,那么語言和文化也是設(shè)計(jì)者必須考慮的內(nèi)容。
三 界面控件的設(shè)計(jì)
確定好整個(gè)系統(tǒng)的界面風(fēng)格以后,就要針對(duì)單獨(dú)的界面進(jìn)行具體設(shè)計(jì)。在此過程中要考慮完成系統(tǒng)功能需要用到哪些控件、這些控件之間的關(guān)系以及它們的相關(guān)性和重要性。
1 符合Windows 界面準(zhǔn)則
Windows 操作系統(tǒng)的主要的優(yōu)點(diǎn)就是為所有的應(yīng)用程序提供了公用的界面。如果用戶知道如何使用基于 Windows 的應(yīng)用程序,就很容易學(xué)會(huì)使用其他應(yīng)用程序。而與已創(chuàng)建的界面準(zhǔn)則相差太遠(yuǎn)的應(yīng)用程序,不容易讓人接受。比如菜單的設(shè)計(jì),大多數(shù)基于 Windows 的應(yīng)用程序都遵循這樣的標(biāo)準(zhǔn):"文件"菜單在最左邊,然后是"編輯"、"工具"等可選的菜單,最右邊是"幫助"菜單。如果把"幫助"菜單放在最前,便會(huì)降低應(yīng)用程序的可用性。子菜單的位置也很重要,用戶本期望在"編輯"菜單下找到"復(fù)制"、"剪切"與"粘貼"等子菜單,若將它們移到"文件"菜單下會(huì)引起用戶的不可理解。不要偏離已經(jīng)創(chuàng)建的準(zhǔn)則太遠(yuǎn),除非有很好的理由這樣做。
2 確定控件的位置
在大多數(shù)界面設(shè)計(jì)中,不是所有的界面元素都一樣重要。仔細(xì)斟酌是很有必要的,以確保越是重要的元素越要快速地顯現(xiàn)給用戶。重要的或者頻繁訪問的元素應(yīng)當(dāng)放在顯著的位置上,而不太重要的元素就應(yīng)當(dāng)降級(jí)到不太顯著的位置上。一般情況下,用戶的眼睛會(huì)首先注視屏幕的左上部位,所以最重要的元素應(yīng)當(dāng)放在屏幕的左上部位。例如,如果窗體上的信息與客戶有關(guān),則它的名字字段應(yīng)當(dāng)顯示在它能最先被看到的地方。而按鈕,如"確定"或"下一個(gè)",應(yīng)當(dāng)放置在屏幕的右下部位,用戶在未完成對(duì)窗體的操作之前,通常不會(huì)訪問這些按鈕。
把控件分成組也很重要,盡量按功能或邏輯關(guān)系進(jìn)行分組。例如對(duì)數(shù)據(jù)庫操作的按鈕應(yīng)當(dāng)被形象地分成一組,而不是分散在窗體的四處,因?yàn)樗鼈兊墓δ鼙舜讼嚓P(guān)。在許多情況下,可以使用框架控件來幫助加強(qiáng)控件之間的這種聯(lián)系。
3 保證界面元素的一致性
在用戶界面設(shè)計(jì)中,一致的外觀可以在應(yīng)用程序中創(chuàng)造一種和諧美。如果界面缺乏一致性,則使應(yīng)用程序看起來非?;靵y、沒有條理,降低了人們使用該應(yīng)用程序的興趣。
為了保持視覺上的一致性,在開始開發(fā)應(yīng)用程序之前應(yīng)先創(chuàng)建整體設(shè)計(jì)策略。諸如控件的類型、控件的尺寸、分組的標(biāo)準(zhǔn)以及字體的選取等設(shè)計(jì)元素都應(yīng)該在事先確定,可以創(chuàng)建設(shè)計(jì)樣板來幫助進(jìn)行設(shè)計(jì)。有時(shí)完成一定的功能有許多的控件可供選擇使用,設(shè)計(jì)時(shí)應(yīng)選取能最能適合特定應(yīng)用程序的控件子集。雖然列表框、組合框、網(wǎng)格以及樹等控件都可用來表示信息列表,在各個(gè)界面上盡可能地使用同一種控件。
設(shè)計(jì)過程中要符合通常的約定,恰當(dāng)?shù)厥褂每丶?。雖然 TextBox 控件也可以設(shè)置其只讀屬性來顯示文本,但 Label 控件更適合于該目的。在為控件設(shè)置屬性時(shí)也要保持一致,如果在一個(gè)地方為可編輯的文本使用白色背景,除非有很好的理由,否則不要在別的地方又使用灰色。窗體的一致性對(duì)應(yīng)用程序的可用性也具有非常重要的作用。如果在一個(gè)窗體上使用了灰色背景以及3d/33.shtml’ target=’_blank’ class=’article’>三維效果,而在另一個(gè)窗體上使用白色背景,則這兩個(gè)窗體就顯得毫不相干。明智的選擇是確定一種類型并在整個(gè)應(yīng)用程序保持一致。
4美化界面和控件
盡量使用具有三維立體效果的控件,從而使用戶界面具有動(dòng)感。例如,用在命令按鈕上的三維立體效果使得它們看上去象是被按下去的。如果設(shè)計(jì)平面邊框的命令按鈕的話,就會(huì)失去這種動(dòng)感,因而不能清楚地告訴用戶它是一個(gè)命令按鈕。文本框也提供了一種動(dòng)感,用戶可以期望帶有邊框和白色背景的框,框中包含可編輯的文本。顯示不帶邊框的文本框 (BorderStyle = 0) 也有可能,這使它看起來更象一個(gè)標(biāo)簽,并且不能明顯地提示用戶它是可編輯的。
在用戶界面中使用空白空間有助于突出元素和改善程序可用性。空白空間是窗體控件之間以及控件四周的空白區(qū)域。一個(gè)窗體上有太多的控件會(huì)導(dǎo)致界面雜亂無章,使得尋找一個(gè)字段或者控件非常困難。在設(shè)計(jì)中需要插入空白空間來突出設(shè)計(jì)元素。各控件之間一致的間隔以及垂直與水平方向元素的對(duì)齊會(huì)使用戶感覺更好一些。 在界面上使用顏色會(huì)增加用戶視覺上的感染力,顏色能夠引發(fā)人們強(qiáng)烈的情感。每個(gè)人對(duì)顏色的喜愛有很大的不同,用戶的品味也會(huì)各不相同。一般說來,保守傳統(tǒng),采用一些柔和的、中性化的顏色。有時(shí)為了突出或吸引人們對(duì)重要區(qū)域的注意可以使用少量明亮的色彩。預(yù)期的讀者以及試圖傳達(dá)的語氣與情緒也會(huì)影響對(duì)顏色的選取,例如明亮的紅色、綠色和黃色適用于小孩子使用的應(yīng)用程序,但在銀行應(yīng)用程序中不一定適合。
圖片與圖標(biāo)的使用也可以增加應(yīng)用界面在視覺上的趣味。帶有表示各種功能的圖標(biāo)的工具欄是一種很有用的界面設(shè)備,但如果不能清晰地識(shí)別圖標(biāo)所表示的功能,反而會(huì)事與愿違。在設(shè)計(jì)工具欄圖標(biāo)時(shí),應(yīng)先了解約定成俗的標(biāo)準(zhǔn)。例如,許多應(yīng)用程序用一張角上有卷邊的紙表示"新建文件"圖標(biāo),若改用其它的表示方法會(huì)引起用戶的混淆。考慮圖象文化上的意義也非常重要,不同的人對(duì)相同圖象的理解會(huì)不一樣。同時(shí)在設(shè)計(jì)自己的圖標(biāo)與圖象時(shí),應(yīng)盡量簡單化。
字體也是用戶界面的重要部分,因?yàn)樗鼈兂3=o用戶傳遞重要的信息。除非計(jì)劃按應(yīng)用程序來配置字體,否則應(yīng)當(dāng)堅(jiān)持使用標(biāo)準(zhǔn) Windows 字體,如 Arial、New Times Roman 、System等。通常手寫字體或者其他裝飾性字體的打印效果比屏幕上的效果更好。注意不要在應(yīng)用程序中使用太多的字體,也不要設(shè)置太小的字體,以免影響用戶閱讀。
界面設(shè)計(jì)中也應(yīng)考慮簡單化的原則,從美學(xué)的角度來講,整潔、簡單明了的設(shè)計(jì)更可取。界面設(shè)計(jì)過程中一個(gè)容易犯的錯(cuò)誤就是力圖用界面來模仿真實(shí)世界的對(duì)象,這沒有必要,對(duì)用戶也沒有真正的意義。是設(shè)計(jì)的界面,既能完成功能、又能讓用戶感到整潔舒心。
四 結(jié)論
總之,界面的設(shè)計(jì)要以用戶為中心,應(yīng)滿足用戶的需求。在此基礎(chǔ)上,還要充分考慮界面的構(gòu)圖或布局,界面元素的位置、界面元素的一致性等問題來美化界面,提高應(yīng)用程序界面的可用性和美感。
有時(shí)在一個(gè)窗口中出現(xiàn)較多的控制件時(shí),如果能向?qū)降亟ㄗh用戶下一步該做什么,不失為上策。
在Visual Basic的程序設(shè)計(jì)中,我們可以使用語句:Object.SetFaocus使我們希望的控件得到輸入焦點(diǎn),舉個(gè)例子:在Form1中我們加入一個(gè)按鈕Command1和一個(gè)文本輸入Text1,雙擊按鈕控件,然后鍵入如下代碼:
Text1.SetFocus
再按F5運(yùn)行程序,您就會(huì)看到一單擊按鈕,文本框會(huì)立即取得輸入焦點(diǎn)。另外,我們還可以使用語句:Sendkeys "{TAB}"使下一個(gè)控件獲得焦點(diǎn),但我們需要在設(shè)計(jì)時(shí)確定各控件的Index值。(在Properties窗口中)讓控件自己感知自己的工作已完成,而主動(dòng)將焦點(diǎn)讓出,會(huì)使用戶覺得應(yīng)用程序很聰明,也減少了用戶出錯(cuò)的機(jī)會(huì)。
可是當(dāng)焦點(diǎn)切換的兩個(gè)控件相隔有一定距離時(shí),上述的方法有時(shí)也不足以引起用戶的注意,那么一種好的解決方法是將鼠標(biāo)箭頭也移到控件上??上?,VB并不支持鼠標(biāo)移動(dòng),那我們就求助API函數(shù),API函數(shù)SetCursorPos可讓我們?nèi)缭浮?BR> 下面是子程序MoveCursorOn,它可讓鼠標(biāo)移動(dòng)到指定控件上方。
下列代碼請(qǐng)放在declarations段中:
Type PoinTAPIx As Integery As IntegerEnd TypeDeclare Sub SetCursorPos Lib "User"(Byval x As Integer,Byval y As Integer)Declare Sub ClientToScreen Lib "User"(Byval hwnd As Integer,IpPoint As PointAPI)Declare Function GetParent Lib "User"(Byval hwnd As Integer)As Integer
然后建立一個(gè)新的子程序(ALT+N→N→鍵入子程序名MoveCursorOn),下面是子程序的代碼:
Sub MoveCursorOn(source As Control)Dim Pt As PoinTAPIDim hparent As Integerp.x=(Source.Left+Source.Width/2)/Screen.Twipsperpixel)p.y=(Source.Top+Source.Height/2)/Screen.Twipsperpixel)hparent=GetParent(source.hwnd)ClientToScreen hparent ptSetCursorPos pt.x pt.yEnd Sub
使用該子程序很容易,例如我們想把鼠標(biāo)移動(dòng)到按鈕Command1上,就可使用語句Move Cursor On Command1
您會(huì)看到鼠標(biāo)箭頭已經(jīng)指著按鈕Command1。
需要說明的是,千萬不要濫用該子程序。讓鼠標(biāo)自己滿屏亂飛,我們的用戶會(huì)感到失去對(duì)應(yīng)用程序的控制,這是違反我們的初衷的。
在有數(shù)個(gè)輸入框的窗口中(這在數(shù)據(jù)庫應(yīng)用程序中是很典型的),當(dāng)用戶完成第一個(gè)輸入框的輸入后,總愛? 性的加一個(gè)回車,希望輸入焦點(diǎn)落到下一個(gè)輸入框中(DOS中大多數(shù)應(yīng)用程序是如此),可往往事與愿違,這一回車卻觸發(fā)了擁有Default特性的按鈕,結(jié)果不是關(guān)閉了當(dāng)前窗口就是又蹦出另一窗口。用戶睜大眼睛看著屏幕,“咦?!我到底做了什么?”這是Windows新用戶經(jīng)常遇到的事情。
解決它其實(shí)很容易,只需在輸入框的KeyPress事件中加入如下代碼:
IF KeyASCII=13 ThenKeyASCII=0Sendkeys "{TAB}"END IF
這樣,當(dāng)用戶在這個(gè)輸入框中鍵入Enter時(shí),就象鍵入TAB鍵時(shí),焦點(diǎn)被移到下一控件上。但需注意,這種方法不適用啟用多行功能的TextBox,即TextBox的MultiLine特性設(shè)為True時(shí),因?yàn)檫@時(shí)的回車鍵是起換行的作用。
MDI(MultipleDocumentInterface,多窗口程序)窗體是這樣定義的:“MDI窗體作為一個(gè)程序的后臺(tái)窗口,包含著MDIChild屬性為True的窗體”。在一個(gè)VB程序中,至多只能存在一個(gè)MDI父窗體,可以有多個(gè)MDI子窗體;建立一個(gè)MDI父窗體的方法是在VB的File菜單里選擇“NewMDIForm”。
在MDI程序運(yùn)行時(shí),如果子窗口具有菜單,那么當(dāng)子窗口被激活時(shí),子窗口的菜單就會(huì)自動(dòng)替換父窗口菜單;當(dāng)子窗口被最小化時(shí),在MDI父窗口里就會(huì)出現(xiàn)子窗口的圖標(biāo)。
Windows的通用圖形界面的出現(xiàn),使計(jì)算機(jī)用戶不必通過專門的學(xué)習(xí)就可以得心應(yīng)手地使用各種Windows的軟件;不僅如此,它還是程序設(shè)計(jì)者在設(shè)計(jì)Windows程序的界面時(shí)所必須遵循的標(biāo)準(zhǔn),這在很大程度上減輕了程序設(shè)計(jì)者的負(fù)擔(dān),使他們能夠把主要精力放在問題的求解和實(shí)現(xiàn)上。
VisualBasic的出現(xiàn),更加簡化了Windows程序界面的設(shè)計(jì)工作,只需要極少量的代碼,就能實(shí)現(xiàn)標(biāo)準(zhǔn)Windows應(yīng)用程序的界面。但是,如果不了解Windows程序界面設(shè)計(jì)的原則,或者不熟悉VB下界面編程的技巧,就難以設(shè)計(jì)和實(shí)現(xiàn)既符合一般標(biāo)準(zhǔn)又具有特色的界面。界面設(shè)計(jì)的原則界面設(shè)計(jì)具有一般性的原則,最為重要的有:
界面要具有一致性。一致性原則在界面設(shè)計(jì)中最容易被違反,同時(shí)也最容易修改和避免。例如,在菜單和聯(lián)機(jī)幫助中必須使用相同的術(shù)語;對(duì)話框必須具有相同的風(fēng)格。
常用操作要有捷徑。常用操作的使用頻度大,應(yīng)該減少操作序列的長度。例如,為文件的常用操作如打開、存盤、另存等設(shè)置快捷鍵。使常用操作具有捷徑,不僅會(huì)提高用戶的工作效率,還使得界面在功能實(shí)現(xiàn)上簡潔和高效。
提供簡單的錯(cuò)誤處理。系統(tǒng)要有錯(cuò)誤處理的功能。在出現(xiàn)錯(cuò)誤時(shí),系統(tǒng)應(yīng)該能檢測出錯(cuò)誤,并且提供簡單和容易理解的錯(cuò)誤處理的功能。錯(cuò)誤出現(xiàn)后系統(tǒng)的狀態(tài)不發(fā)生變化,或者系統(tǒng)要提供錯(cuò)誤恢復(fù)的指導(dǎo)。
提供信息反饋。對(duì)操作人員的重要操作要有信息反饋。對(duì)常用操作和簡單操作的反饋可以不作要求,但是對(duì)不常用操作和至關(guān)重要的操作,系統(tǒng)應(yīng)該提供信息的反饋。
操作可逆。操作應(yīng)該可逆。這對(duì)于不具備專門的知識(shí)的操作人員相當(dāng)有用??赡娴膭?dòng)作可以是單個(gè)的操作,或是者一個(gè)相對(duì)獨(dú)立的操作序列。
設(shè)計(jì)良好的聯(lián)機(jī)幫助。雖然對(duì)于熟練用戶來說,聯(lián)機(jī)幫助并非必不可少,但是對(duì)于大多數(shù)不熟練用戶來說,聯(lián)機(jī)幫助具有非常重要的作用。
菜單設(shè)計(jì)的原則和編程
菜單設(shè)? 如下的一般性原則:
按照系統(tǒng)的功能來組織菜單。
要選用廣而淺的菜單樹,而不是窄而深的菜單樹。
根據(jù)菜單選項(xiàng)的含義進(jìn)行分組;并且按一定的規(guī)則排序。菜單選項(xiàng)的標(biāo)題要力求簡短、含義明確,并且以關(guān)鍵詞開始。
常用選項(xiàng)要設(shè)置快捷鍵。結(jié)合以上的原則,菜單編程有以下幾方面的技術(shù)和技巧:
菜單選項(xiàng)的分組
在VB中,菜單選項(xiàng)的分組是通過菜單欄分隔橫線實(shí)現(xiàn)的。在菜單的一定位置增加一個(gè)Caption屬性為“?”的菜單項(xiàng),它在菜單上就表現(xiàn)為一條橫線。在許多情況下,同一個(gè)功能菜單下又可以按照菜單選項(xiàng)的功能分為幾組,這時(shí)就可以用分隔橫線來實(shí)現(xiàn)菜單項(xiàng)的分組。
常用選項(xiàng)快捷鍵的設(shè)置
打開菜單設(shè)計(jì)窗口(MenuDesignWindow),應(yīng)對(duì)于每個(gè)菜單選項(xiàng)有相應(yīng)的快捷鍵(Shortcut)列表,在該表中選擇一個(gè)即可。需要注意的是,具有子菜單的菜單或者頂層菜單的快捷鍵不能這樣定義。按照Windows的界面設(shè)計(jì)原則,頂層菜單的快捷鍵的形式是Alt+字母鍵。它的實(shí)現(xiàn)方法在后文另敘。
對(duì)于一些常用的功能菜單項(xiàng),有約定俗成的快捷鍵。例如,文件打開用CTRL+O,文件存盤用CRTL+S,打印用CTRL+P,等取?/p>
為菜單選項(xiàng)定義好快捷鍵之后,菜單上該選項(xiàng)的后面就出現(xiàn)了快捷鍵的文字表示。
菜單選項(xiàng)的使能與禁止、可見與隱藏為了表示菜單選項(xiàng)的一些特殊功能,可能要用到菜單選項(xiàng)的使能與禁止、可見與隱藏屬性。當(dāng)因?yàn)槟撤N原因使得某個(gè)選項(xiàng)所代表的功能不能被實(shí)現(xiàn)時(shí),就應(yīng)該禁止該選項(xiàng)被選中。菜單選項(xiàng)的使能與禁止是通過改變改選項(xiàng)的Enabled屬性實(shí)現(xiàn)的。舉例來說,假設(shè)菜單選項(xiàng)名為nmuName,則禁止該選項(xiàng)可以如下實(shí)現(xiàn):
mnuName.Enabled=False
同理,隱藏一個(gè)選項(xiàng)可以用
mnuName.Visible=False
來實(shí)現(xiàn),而使一個(gè)隱藏的選項(xiàng)恢復(fù)可見則用
mnuName.Visible=True
實(shí)現(xiàn)。
菜單項(xiàng)的隱藏與恢復(fù)可見常常用在動(dòng)態(tài)菜單的實(shí)現(xiàn)中。
菜單項(xiàng)的動(dòng)態(tài)裝入
菜單項(xiàng)的動(dòng)態(tài)裝入是指菜單項(xiàng)的個(gè)數(shù)不固定,并且能夠在需要時(shí)動(dòng)態(tài)地裝入。最簡單的例子就是文件菜單中最近打開的文件的列表。在第一次打開文件之前,該列表是空的,并且不在文件菜單中出現(xiàn);打開一個(gè)文件后,該列表不再是空的,并且文件菜單中出現(xiàn)代表被打開文件的菜單項(xiàng)。
在上面的例子里,就綜合運(yùn)用了菜單項(xiàng)的下標(biāo)屬性(Index)、標(biāo)題屬性(Caption)、可見屬性(Visible)以及菜單項(xiàng)的裝入方法(LoadMethod)。
具體的實(shí)現(xiàn)過程如下:
在文件菜單里增加一個(gè)菜單項(xiàng),標(biāo)題任意,并假設(shè)菜單項(xiàng)的Name屬性是opened_files_list;
更改菜單項(xiàng)opened_files_list的可見屬性,使opened_files_list.Visible=False
更改菜單項(xiàng)opened_files_list的下標(biāo)屬性,使
opened_files_files_list.Index=0
在程序中控制菜單項(xiàng)opened_files_list的動(dòng)態(tài)裝入。
假設(shè)要顯示打開過的第二文件的文件名,并且該文件名存放在一個(gè)文件名數(shù)組opened_file_name里。以下的代碼就實(shí)現(xiàn)了這一功能:
Loadopened_files_list(1)
opened_files_lise(1).Caption="&2"+opened_file_name(1)
opened_files_list(1).Visible=True
需要注意的是,對(duì)于下標(biāo)為0的菜單項(xiàng),不能用Load方法。因?yàn)樵诔绦驁?zhí)行時(shí),該菜單項(xiàng)就已經(jīng)被裝入到內(nèi)存里了;另外,在菜單項(xiàng)的標(biāo)題屬性字符里的“&”字符具有特殊的含義,它的作用是在顯示該屬性字符串的同時(shí),并不顯示“&”本身,而緊跟“&”的字符在顯示時(shí)具有下劃線,并且該字符成為熱鍵。
如果下標(biāo)不為0的菜單項(xiàng)不再需要,為了減少對(duì)內(nèi)存資源的占用,可以用Unload方法把它從內(nèi)存卸出;同樣地,不能用Unload卸出下標(biāo)為0的菜單項(xiàng)。
彈出式菜單的實(shí)現(xiàn)(PopupMenuMethod)
VB中在菜單設(shè)計(jì)窗口(MenuDesignWindow)中設(shè)計(jì)的菜單是下拉式菜單。下拉式菜單是用戶在任何時(shí)候都可以在頂端菜單條上選擇后拉出的菜單,而彈出式菜單則是在程序界面的一定區(qū)域內(nèi)點(diǎn)按鼠標(biāo)鍵后出現(xiàn)的菜單。在某些情況下,彈出式菜單會(huì)使系統(tǒng)功能的實(shí)現(xiàn)更加簡潔和高效,使用起來更加得心應(yīng)手。
Widnows程序的彈出式菜單一般是當(dāng)用戶在程序的桌面上點(diǎn)按鼠標(biāo)鍵時(shí)出現(xiàn)的。彈出式菜單多用于實(shí)現(xiàn)系統(tǒng)的附加或增強(qiáng)功能。彈出式菜單的內(nèi)容,可以隨點(diǎn)按鼠標(biāo)鍵的位置不同而變化。由于彈出的菜單要覆蓋屏幕的一部分,所以應(yīng)盡量縮短菜單里的文字。
在VB中,彈出式菜單的實(shí)現(xiàn)要用到下拉式菜單設(shè)計(jì)的技術(shù)和PopupMenu方法。具體的做法是:
在菜單設(shè)計(jì)窗口(MenuDesignWindow)里設(shè)計(jì)好相應(yīng)窗體的彈出式菜單。要注意的是,要彈出的菜單必須至少有一個(gè)子菜單;因而這個(gè)菜單不能有快捷鍵,并且Checked屬性必須是False。再把彈出式菜單的Visible屬性改為False。
在具有設(shè)計(jì)好的彈出式菜單的窗體的Form_Click中加入以下代碼(假設(shè)彈出式菜單的Name屬性是mnuExample):
SubForm_Click()
PopupMenumnuExample
EndSub
如果要求只有按下鼠標(biāo)左鍵或者右鍵才能激活菜單,就必須在Form_MouseDown里加入如下代碼:
SubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
IfButton=2thenButton=2表示鼠標(biāo)右鍵
PopupMenumnuExample
EndIf
PopupMenu的完整句法是:
[Form.]PopupMenumenuname[flags[,x[,y]]]
改變flags的值可以控制彈出式菜單的表現(xiàn)形式。Flags有兩組值。第一組值用來控制菜單的顯示方式,包括POPUPMENU_LEFTALIGNPOPUPMENU_CENTERALIGN,POPUPMENU_RIGHTALIGN,分別表示以x為左邊界,以x為中心和以x為右邊界的顯示方式,并且以x為左邊界是缺省的方式;另外一組值用來控制菜單項(xiàng)的選中方式,包括POPUPMENU_LEFTBUTTON和POPUPMENU_RIGHTBUTTON,分別表示左鍵選中和左/右鍵選中均可,并且左鍵選中是缺省的方式。Flags的值由上面的兩組值經(jīng)過OR運(yùn)算得出。例如,要求左對(duì)齊顯示并且左鍵選中為準(zhǔn),則應(yīng)有:
flags=POPUPMENU_LEFTALIGNORPOPUPMENU_LEFTBUTTON
x和y用來定義菜單彈出的位置、缺省是鼠標(biāo)點(diǎn)中的位置。
菜單項(xiàng)的其他屬性
用ALT+字母鍵激活頂層菜單,或者在菜單激活后用字母鍵激活一個(gè)菜單項(xiàng),必須學(xué)會(huì)使用&。&用在菜單項(xiàng)的標(biāo)題屬性(Caption)里。它的用法和作用與在用C語言編制的Windows程序中的用法和作用相同。
有時(shí)希望頂層菜單之間的間隔大一些,或者某個(gè)頂層菜單出現(xiàn)在菜單條的最右端,這時(shí)就要用到標(biāo)題屬性是空格的菜單。如果一個(gè)菜單的標(biāo)題是由多個(gè)空格組成的,那么這個(gè)菜單在菜單條上就占用跟空格的個(gè)數(shù)相應(yīng)的空間,并且它后面的菜單也順序地后移;如果這個(gè)菜單的Visible屬性是False,那么它就跟不存在一樣。
窗口設(shè)計(jì)的原則和舉例
下面是一個(gè)浮動(dòng)窗口技術(shù)的例子。為了引起用戶的注意,或者必須保證含有重要信息的窗口不被其他窗口覆蓋,就要用到浮動(dòng)窗口技術(shù),建立一個(gè)“總在最前面”(TopMost)的窗口。具體的做法是:
(1)在VB程序中加入如下的聲明:
DeclareFunctionSetWindowPosLib"user"(Byvalh%,Byvalhb%,Byvalx%,Byvaly%,By
valcx%,Byvalcy%,Byvalf%)AsInteger
GlobalConstSWP_NOMOVE=2
GlobalConstSWP_NOSIZE=1
GlobalConstHWND_MOST=?1
GlobalConstHWND_NOMOST=?2
GlobalConstFLAGS=SWP_NOMOVEOrSWP_NOSIZE
(2)假設(shè)要把窗體frmExample設(shè)置成總在最前面的窗口,只要在frmExample窗體的Form_Load
過程里加入以下代碼:
Dimsuccess%
success=SetWindowPos(frmExample.hWnd,HWND_MOST,0,0,0,0,FLAGS)
如果要取消總在最前面的特性,則可以執(zhí)行如下的代碼:
success=SetWindowPos(frmExample.hWnd,HWND_NOMOST,0,0,0,0,FLAGS)
success不等于0表示SetWindowPos執(zhí)行成功。
在MDI程序里,有一個(gè)窗口是所有其他窗口的父窗口,各個(gè)子窗口完成相對(duì)獨(dú)立的功能,就像是多個(gè)獨(dú)立的工具組合起來一樣。在這方面,MSWord和Windows的FileManager是的例子。
用戶界面是一個(gè)應(yīng)用程序最重要的部分,對(duì)用戶而言,界面就是應(yīng)用程序,他們感覺不到幕后正在執(zhí)行的代碼。不論花多少時(shí)間和精力來編制和優(yōu)化代碼,應(yīng)用程序的可用性仍然在很大程度上依賴于界面的好壞。第一步就設(shè)計(jì)出非常完美的界面是十分困難的,它需要在用戶的參與下進(jìn)行多次反復(fù)。要想設(shè)計(jì)出讓用戶滿意的界面,首先要知道什么是好的界面,針對(duì)自己要開發(fā)的應(yīng)用程序做出初步規(guī)劃設(shè)計(jì)。
二 界面設(shè)計(jì)初步規(guī)劃
設(shè)計(jì)用戶界面之前,先參照 Microsoft 或其他公司的一些應(yīng)用程序。在這個(gè)過程中,我們會(huì)發(fā)現(xiàn)許多通用的東西,比如:工具欄、狀態(tài)條、工具提示、上下文菜單以及標(biāo)記對(duì)話框。同時(shí)也要憑借自己使用軟件的經(jīng)驗(yàn),想一想曾經(jīng)使用過的一些界面好的應(yīng)用程序,哪些可以吸收利用。但要記住個(gè)人的喜好不等于用戶的喜好,必須把用戶的意見和需求吸收近來。眾所周知,用戶參與設(shè)計(jì)過程的時(shí)間越早,設(shè)計(jì)人員所花的時(shí)間和精力就越少,創(chuàng)建的界面就越好、越實(shí)用。
設(shè)計(jì)一個(gè)應(yīng)用程序界面時(shí),應(yīng)該先對(duì)整個(gè)系統(tǒng)界面進(jìn)行初步規(guī)劃??紤]應(yīng)該使用單文檔還是多文檔樣式?需要多少個(gè)不同的窗體?菜單中將包含什么命令?要不要使用工具欄重復(fù)菜單的功能?提供什么對(duì)話框與用戶交互?需要提供什么樣的幫助?
界面設(shè)計(jì)也需要考慮應(yīng)用程序的目的是什么、預(yù)期的用戶是誰等問題。經(jīng)常使用的應(yīng)用程序和偶爾使用的輔助程序要區(qū)別對(duì)待,用來顯示信息的應(yīng)用程序與用來收集信息的應(yīng)用程序也有應(yīng)所不同。目標(biāo)是針對(duì)初學(xué)者的應(yīng)用程序,界面設(shè)計(jì)要求簡單明了,而針對(duì)有經(jīng)驗(yàn)用戶卻可以復(fù)雜一些。如果系統(tǒng)計(jì)劃發(fā)布到全球,那么語言和文化也是設(shè)計(jì)者必須考慮的內(nèi)容。
三 界面控件的設(shè)計(jì)
確定好整個(gè)系統(tǒng)的界面風(fēng)格以后,就要針對(duì)單獨(dú)的界面進(jìn)行具體設(shè)計(jì)。在此過程中要考慮完成系統(tǒng)功能需要用到哪些控件、這些控件之間的關(guān)系以及它們的相關(guān)性和重要性。
1 符合Windows 界面準(zhǔn)則
Windows 操作系統(tǒng)的主要的優(yōu)點(diǎn)就是為所有的應(yīng)用程序提供了公用的界面。如果用戶知道如何使用基于 Windows 的應(yīng)用程序,就很容易學(xué)會(huì)使用其他應(yīng)用程序。而與已創(chuàng)建的界面準(zhǔn)則相差太遠(yuǎn)的應(yīng)用程序,不容易讓人接受。比如菜單的設(shè)計(jì),大多數(shù)基于 Windows 的應(yīng)用程序都遵循這樣的標(biāo)準(zhǔn):"文件"菜單在最左邊,然后是"編輯"、"工具"等可選的菜單,最右邊是"幫助"菜單。如果把"幫助"菜單放在最前,便會(huì)降低應(yīng)用程序的可用性。子菜單的位置也很重要,用戶本期望在"編輯"菜單下找到"復(fù)制"、"剪切"與"粘貼"等子菜單,若將它們移到"文件"菜單下會(huì)引起用戶的不可理解。不要偏離已經(jīng)創(chuàng)建的準(zhǔn)則太遠(yuǎn),除非有很好的理由這樣做。
2 確定控件的位置
在大多數(shù)界面設(shè)計(jì)中,不是所有的界面元素都一樣重要。仔細(xì)斟酌是很有必要的,以確保越是重要的元素越要快速地顯現(xiàn)給用戶。重要的或者頻繁訪問的元素應(yīng)當(dāng)放在顯著的位置上,而不太重要的元素就應(yīng)當(dāng)降級(jí)到不太顯著的位置上。一般情況下,用戶的眼睛會(huì)首先注視屏幕的左上部位,所以最重要的元素應(yīng)當(dāng)放在屏幕的左上部位。例如,如果窗體上的信息與客戶有關(guān),則它的名字字段應(yīng)當(dāng)顯示在它能最先被看到的地方。而按鈕,如"確定"或"下一個(gè)",應(yīng)當(dāng)放置在屏幕的右下部位,用戶在未完成對(duì)窗體的操作之前,通常不會(huì)訪問這些按鈕。
把控件分成組也很重要,盡量按功能或邏輯關(guān)系進(jìn)行分組。例如對(duì)數(shù)據(jù)庫操作的按鈕應(yīng)當(dāng)被形象地分成一組,而不是分散在窗體的四處,因?yàn)樗鼈兊墓δ鼙舜讼嚓P(guān)。在許多情況下,可以使用框架控件來幫助加強(qiáng)控件之間的這種聯(lián)系。
3 保證界面元素的一致性
在用戶界面設(shè)計(jì)中,一致的外觀可以在應(yīng)用程序中創(chuàng)造一種和諧美。如果界面缺乏一致性,則使應(yīng)用程序看起來非?;靵y、沒有條理,降低了人們使用該應(yīng)用程序的興趣。
為了保持視覺上的一致性,在開始開發(fā)應(yīng)用程序之前應(yīng)先創(chuàng)建整體設(shè)計(jì)策略。諸如控件的類型、控件的尺寸、分組的標(biāo)準(zhǔn)以及字體的選取等設(shè)計(jì)元素都應(yīng)該在事先確定,可以創(chuàng)建設(shè)計(jì)樣板來幫助進(jìn)行設(shè)計(jì)。有時(shí)完成一定的功能有許多的控件可供選擇使用,設(shè)計(jì)時(shí)應(yīng)選取能最能適合特定應(yīng)用程序的控件子集。雖然列表框、組合框、網(wǎng)格以及樹等控件都可用來表示信息列表,在各個(gè)界面上盡可能地使用同一種控件。
設(shè)計(jì)過程中要符合通常的約定,恰當(dāng)?shù)厥褂每丶?。雖然 TextBox 控件也可以設(shè)置其只讀屬性來顯示文本,但 Label 控件更適合于該目的。在為控件設(shè)置屬性時(shí)也要保持一致,如果在一個(gè)地方為可編輯的文本使用白色背景,除非有很好的理由,否則不要在別的地方又使用灰色。窗體的一致性對(duì)應(yīng)用程序的可用性也具有非常重要的作用。如果在一個(gè)窗體上使用了灰色背景以及3d/33.shtml’ target=’_blank’ class=’article’>三維效果,而在另一個(gè)窗體上使用白色背景,則這兩個(gè)窗體就顯得毫不相干。明智的選擇是確定一種類型并在整個(gè)應(yīng)用程序保持一致。
4美化界面和控件
盡量使用具有三維立體效果的控件,從而使用戶界面具有動(dòng)感。例如,用在命令按鈕上的三維立體效果使得它們看上去象是被按下去的。如果設(shè)計(jì)平面邊框的命令按鈕的話,就會(huì)失去這種動(dòng)感,因而不能清楚地告訴用戶它是一個(gè)命令按鈕。文本框也提供了一種動(dòng)感,用戶可以期望帶有邊框和白色背景的框,框中包含可編輯的文本。顯示不帶邊框的文本框 (BorderStyle = 0) 也有可能,這使它看起來更象一個(gè)標(biāo)簽,并且不能明顯地提示用戶它是可編輯的。
在用戶界面中使用空白空間有助于突出元素和改善程序可用性。空白空間是窗體控件之間以及控件四周的空白區(qū)域。一個(gè)窗體上有太多的控件會(huì)導(dǎo)致界面雜亂無章,使得尋找一個(gè)字段或者控件非常困難。在設(shè)計(jì)中需要插入空白空間來突出設(shè)計(jì)元素。各控件之間一致的間隔以及垂直與水平方向元素的對(duì)齊會(huì)使用戶感覺更好一些。 在界面上使用顏色會(huì)增加用戶視覺上的感染力,顏色能夠引發(fā)人們強(qiáng)烈的情感。每個(gè)人對(duì)顏色的喜愛有很大的不同,用戶的品味也會(huì)各不相同。一般說來,保守傳統(tǒng),采用一些柔和的、中性化的顏色。有時(shí)為了突出或吸引人們對(duì)重要區(qū)域的注意可以使用少量明亮的色彩。預(yù)期的讀者以及試圖傳達(dá)的語氣與情緒也會(huì)影響對(duì)顏色的選取,例如明亮的紅色、綠色和黃色適用于小孩子使用的應(yīng)用程序,但在銀行應(yīng)用程序中不一定適合。
圖片與圖標(biāo)的使用也可以增加應(yīng)用界面在視覺上的趣味。帶有表示各種功能的圖標(biāo)的工具欄是一種很有用的界面設(shè)備,但如果不能清晰地識(shí)別圖標(biāo)所表示的功能,反而會(huì)事與愿違。在設(shè)計(jì)工具欄圖標(biāo)時(shí),應(yīng)先了解約定成俗的標(biāo)準(zhǔn)。例如,許多應(yīng)用程序用一張角上有卷邊的紙表示"新建文件"圖標(biāo),若改用其它的表示方法會(huì)引起用戶的混淆。考慮圖象文化上的意義也非常重要,不同的人對(duì)相同圖象的理解會(huì)不一樣。同時(shí)在設(shè)計(jì)自己的圖標(biāo)與圖象時(shí),應(yīng)盡量簡單化。
字體也是用戶界面的重要部分,因?yàn)樗鼈兂3=o用戶傳遞重要的信息。除非計(jì)劃按應(yīng)用程序來配置字體,否則應(yīng)當(dāng)堅(jiān)持使用標(biāo)準(zhǔn) Windows 字體,如 Arial、New Times Roman 、System等。通常手寫字體或者其他裝飾性字體的打印效果比屏幕上的效果更好。注意不要在應(yīng)用程序中使用太多的字體,也不要設(shè)置太小的字體,以免影響用戶閱讀。
界面設(shè)計(jì)中也應(yīng)考慮簡單化的原則,從美學(xué)的角度來講,整潔、簡單明了的設(shè)計(jì)更可取。界面設(shè)計(jì)過程中一個(gè)容易犯的錯(cuò)誤就是力圖用界面來模仿真實(shí)世界的對(duì)象,這沒有必要,對(duì)用戶也沒有真正的意義。是設(shè)計(jì)的界面,既能完成功能、又能讓用戶感到整潔舒心。
四 結(jié)論
總之,界面的設(shè)計(jì)要以用戶為中心,應(yīng)滿足用戶的需求。在此基礎(chǔ)上,還要充分考慮界面的構(gòu)圖或布局,界面元素的位置、界面元素的一致性等問題來美化界面,提高應(yīng)用程序界面的可用性和美感。
有時(shí)在一個(gè)窗口中出現(xiàn)較多的控制件時(shí),如果能向?qū)降亟ㄗh用戶下一步該做什么,不失為上策。
在Visual Basic的程序設(shè)計(jì)中,我們可以使用語句:Object.SetFaocus使我們希望的控件得到輸入焦點(diǎn),舉個(gè)例子:在Form1中我們加入一個(gè)按鈕Command1和一個(gè)文本輸入Text1,雙擊按鈕控件,然后鍵入如下代碼:
Text1.SetFocus
再按F5運(yùn)行程序,您就會(huì)看到一單擊按鈕,文本框會(huì)立即取得輸入焦點(diǎn)。另外,我們還可以使用語句:Sendkeys "{TAB}"使下一個(gè)控件獲得焦點(diǎn),但我們需要在設(shè)計(jì)時(shí)確定各控件的Index值。(在Properties窗口中)讓控件自己感知自己的工作已完成,而主動(dòng)將焦點(diǎn)讓出,會(huì)使用戶覺得應(yīng)用程序很聰明,也減少了用戶出錯(cuò)的機(jī)會(huì)。
可是當(dāng)焦點(diǎn)切換的兩個(gè)控件相隔有一定距離時(shí),上述的方法有時(shí)也不足以引起用戶的注意,那么一種好的解決方法是將鼠標(biāo)箭頭也移到控件上??上?,VB并不支持鼠標(biāo)移動(dòng),那我們就求助API函數(shù),API函數(shù)SetCursorPos可讓我們?nèi)缭浮?BR> 下面是子程序MoveCursorOn,它可讓鼠標(biāo)移動(dòng)到指定控件上方。
下列代碼請(qǐng)放在declarations段中:
Type PoinTAPIx As Integery As IntegerEnd TypeDeclare Sub SetCursorPos Lib "User"(Byval x As Integer,Byval y As Integer)Declare Sub ClientToScreen Lib "User"(Byval hwnd As Integer,IpPoint As PointAPI)Declare Function GetParent Lib "User"(Byval hwnd As Integer)As Integer
然后建立一個(gè)新的子程序(ALT+N→N→鍵入子程序名MoveCursorOn),下面是子程序的代碼:
Sub MoveCursorOn(source As Control)Dim Pt As PoinTAPIDim hparent As Integerp.x=(Source.Left+Source.Width/2)/Screen.Twipsperpixel)p.y=(Source.Top+Source.Height/2)/Screen.Twipsperpixel)hparent=GetParent(source.hwnd)ClientToScreen hparent ptSetCursorPos pt.x pt.yEnd Sub
使用該子程序很容易,例如我們想把鼠標(biāo)移動(dòng)到按鈕Command1上,就可使用語句Move Cursor On Command1
您會(huì)看到鼠標(biāo)箭頭已經(jīng)指著按鈕Command1。
需要說明的是,千萬不要濫用該子程序。讓鼠標(biāo)自己滿屏亂飛,我們的用戶會(huì)感到失去對(duì)應(yīng)用程序的控制,這是違反我們的初衷的。
在有數(shù)個(gè)輸入框的窗口中(這在數(shù)據(jù)庫應(yīng)用程序中是很典型的),當(dāng)用戶完成第一個(gè)輸入框的輸入后,總愛? 性的加一個(gè)回車,希望輸入焦點(diǎn)落到下一個(gè)輸入框中(DOS中大多數(shù)應(yīng)用程序是如此),可往往事與愿違,這一回車卻觸發(fā)了擁有Default特性的按鈕,結(jié)果不是關(guān)閉了當(dāng)前窗口就是又蹦出另一窗口。用戶睜大眼睛看著屏幕,“咦?!我到底做了什么?”這是Windows新用戶經(jīng)常遇到的事情。
解決它其實(shí)很容易,只需在輸入框的KeyPress事件中加入如下代碼:
IF KeyASCII=13 ThenKeyASCII=0Sendkeys "{TAB}"END IF
這樣,當(dāng)用戶在這個(gè)輸入框中鍵入Enter時(shí),就象鍵入TAB鍵時(shí),焦點(diǎn)被移到下一控件上。但需注意,這種方法不適用啟用多行功能的TextBox,即TextBox的MultiLine特性設(shè)為True時(shí),因?yàn)檫@時(shí)的回車鍵是起換行的作用。
MDI(MultipleDocumentInterface,多窗口程序)窗體是這樣定義的:“MDI窗體作為一個(gè)程序的后臺(tái)窗口,包含著MDIChild屬性為True的窗體”。在一個(gè)VB程序中,至多只能存在一個(gè)MDI父窗體,可以有多個(gè)MDI子窗體;建立一個(gè)MDI父窗體的方法是在VB的File菜單里選擇“NewMDIForm”。
在MDI程序運(yùn)行時(shí),如果子窗口具有菜單,那么當(dāng)子窗口被激活時(shí),子窗口的菜單就會(huì)自動(dòng)替換父窗口菜單;當(dāng)子窗口被最小化時(shí),在MDI父窗口里就會(huì)出現(xiàn)子窗口的圖標(biāo)。
Windows的通用圖形界面的出現(xiàn),使計(jì)算機(jī)用戶不必通過專門的學(xué)習(xí)就可以得心應(yīng)手地使用各種Windows的軟件;不僅如此,它還是程序設(shè)計(jì)者在設(shè)計(jì)Windows程序的界面時(shí)所必須遵循的標(biāo)準(zhǔn),這在很大程度上減輕了程序設(shè)計(jì)者的負(fù)擔(dān),使他們能夠把主要精力放在問題的求解和實(shí)現(xiàn)上。
VisualBasic的出現(xiàn),更加簡化了Windows程序界面的設(shè)計(jì)工作,只需要極少量的代碼,就能實(shí)現(xiàn)標(biāo)準(zhǔn)Windows應(yīng)用程序的界面。但是,如果不了解Windows程序界面設(shè)計(jì)的原則,或者不熟悉VB下界面編程的技巧,就難以設(shè)計(jì)和實(shí)現(xiàn)既符合一般標(biāo)準(zhǔn)又具有特色的界面。界面設(shè)計(jì)的原則界面設(shè)計(jì)具有一般性的原則,最為重要的有:
界面要具有一致性。一致性原則在界面設(shè)計(jì)中最容易被違反,同時(shí)也最容易修改和避免。例如,在菜單和聯(lián)機(jī)幫助中必須使用相同的術(shù)語;對(duì)話框必須具有相同的風(fēng)格。
常用操作要有捷徑。常用操作的使用頻度大,應(yīng)該減少操作序列的長度。例如,為文件的常用操作如打開、存盤、另存等設(shè)置快捷鍵。使常用操作具有捷徑,不僅會(huì)提高用戶的工作效率,還使得界面在功能實(shí)現(xiàn)上簡潔和高效。
提供簡單的錯(cuò)誤處理。系統(tǒng)要有錯(cuò)誤處理的功能。在出現(xiàn)錯(cuò)誤時(shí),系統(tǒng)應(yīng)該能檢測出錯(cuò)誤,并且提供簡單和容易理解的錯(cuò)誤處理的功能。錯(cuò)誤出現(xiàn)后系統(tǒng)的狀態(tài)不發(fā)生變化,或者系統(tǒng)要提供錯(cuò)誤恢復(fù)的指導(dǎo)。
提供信息反饋。對(duì)操作人員的重要操作要有信息反饋。對(duì)常用操作和簡單操作的反饋可以不作要求,但是對(duì)不常用操作和至關(guān)重要的操作,系統(tǒng)應(yīng)該提供信息的反饋。
操作可逆。操作應(yīng)該可逆。這對(duì)于不具備專門的知識(shí)的操作人員相當(dāng)有用??赡娴膭?dòng)作可以是單個(gè)的操作,或是者一個(gè)相對(duì)獨(dú)立的操作序列。
設(shè)計(jì)良好的聯(lián)機(jī)幫助。雖然對(duì)于熟練用戶來說,聯(lián)機(jī)幫助并非必不可少,但是對(duì)于大多數(shù)不熟練用戶來說,聯(lián)機(jī)幫助具有非常重要的作用。
菜單設(shè)計(jì)的原則和編程
菜單設(shè)? 如下的一般性原則:
按照系統(tǒng)的功能來組織菜單。
要選用廣而淺的菜單樹,而不是窄而深的菜單樹。
根據(jù)菜單選項(xiàng)的含義進(jìn)行分組;并且按一定的規(guī)則排序。菜單選項(xiàng)的標(biāo)題要力求簡短、含義明確,并且以關(guān)鍵詞開始。
常用選項(xiàng)要設(shè)置快捷鍵。結(jié)合以上的原則,菜單編程有以下幾方面的技術(shù)和技巧:
菜單選項(xiàng)的分組
在VB中,菜單選項(xiàng)的分組是通過菜單欄分隔橫線實(shí)現(xiàn)的。在菜單的一定位置增加一個(gè)Caption屬性為“?”的菜單項(xiàng),它在菜單上就表現(xiàn)為一條橫線。在許多情況下,同一個(gè)功能菜單下又可以按照菜單選項(xiàng)的功能分為幾組,這時(shí)就可以用分隔橫線來實(shí)現(xiàn)菜單項(xiàng)的分組。
常用選項(xiàng)快捷鍵的設(shè)置
打開菜單設(shè)計(jì)窗口(MenuDesignWindow),應(yīng)對(duì)于每個(gè)菜單選項(xiàng)有相應(yīng)的快捷鍵(Shortcut)列表,在該表中選擇一個(gè)即可。需要注意的是,具有子菜單的菜單或者頂層菜單的快捷鍵不能這樣定義。按照Windows的界面設(shè)計(jì)原則,頂層菜單的快捷鍵的形式是Alt+字母鍵。它的實(shí)現(xiàn)方法在后文另敘。
對(duì)于一些常用的功能菜單項(xiàng),有約定俗成的快捷鍵。例如,文件打開用CTRL+O,文件存盤用CRTL+S,打印用CTRL+P,等取?/p>
為菜單選項(xiàng)定義好快捷鍵之后,菜單上該選項(xiàng)的后面就出現(xiàn)了快捷鍵的文字表示。
菜單選項(xiàng)的使能與禁止、可見與隱藏為了表示菜單選項(xiàng)的一些特殊功能,可能要用到菜單選項(xiàng)的使能與禁止、可見與隱藏屬性。當(dāng)因?yàn)槟撤N原因使得某個(gè)選項(xiàng)所代表的功能不能被實(shí)現(xiàn)時(shí),就應(yīng)該禁止該選項(xiàng)被選中。菜單選項(xiàng)的使能與禁止是通過改變改選項(xiàng)的Enabled屬性實(shí)現(xiàn)的。舉例來說,假設(shè)菜單選項(xiàng)名為nmuName,則禁止該選項(xiàng)可以如下實(shí)現(xiàn):
mnuName.Enabled=False
同理,隱藏一個(gè)選項(xiàng)可以用
mnuName.Visible=False
來實(shí)現(xiàn),而使一個(gè)隱藏的選項(xiàng)恢復(fù)可見則用
mnuName.Visible=True
實(shí)現(xiàn)。
菜單項(xiàng)的隱藏與恢復(fù)可見常常用在動(dòng)態(tài)菜單的實(shí)現(xiàn)中。
菜單項(xiàng)的動(dòng)態(tài)裝入
菜單項(xiàng)的動(dòng)態(tài)裝入是指菜單項(xiàng)的個(gè)數(shù)不固定,并且能夠在需要時(shí)動(dòng)態(tài)地裝入。最簡單的例子就是文件菜單中最近打開的文件的列表。在第一次打開文件之前,該列表是空的,并且不在文件菜單中出現(xiàn);打開一個(gè)文件后,該列表不再是空的,并且文件菜單中出現(xiàn)代表被打開文件的菜單項(xiàng)。
在上面的例子里,就綜合運(yùn)用了菜單項(xiàng)的下標(biāo)屬性(Index)、標(biāo)題屬性(Caption)、可見屬性(Visible)以及菜單項(xiàng)的裝入方法(LoadMethod)。
具體的實(shí)現(xiàn)過程如下:
在文件菜單里增加一個(gè)菜單項(xiàng),標(biāo)題任意,并假設(shè)菜單項(xiàng)的Name屬性是opened_files_list;
更改菜單項(xiàng)opened_files_list的可見屬性,使opened_files_list.Visible=False
更改菜單項(xiàng)opened_files_list的下標(biāo)屬性,使
opened_files_files_list.Index=0
在程序中控制菜單項(xiàng)opened_files_list的動(dòng)態(tài)裝入。
假設(shè)要顯示打開過的第二文件的文件名,并且該文件名存放在一個(gè)文件名數(shù)組opened_file_name里。以下的代碼就實(shí)現(xiàn)了這一功能:
Loadopened_files_list(1)
opened_files_lise(1).Caption="&2"+opened_file_name(1)
opened_files_list(1).Visible=True
需要注意的是,對(duì)于下標(biāo)為0的菜單項(xiàng),不能用Load方法。因?yàn)樵诔绦驁?zhí)行時(shí),該菜單項(xiàng)就已經(jīng)被裝入到內(nèi)存里了;另外,在菜單項(xiàng)的標(biāo)題屬性字符里的“&”字符具有特殊的含義,它的作用是在顯示該屬性字符串的同時(shí),并不顯示“&”本身,而緊跟“&”的字符在顯示時(shí)具有下劃線,并且該字符成為熱鍵。
如果下標(biāo)不為0的菜單項(xiàng)不再需要,為了減少對(duì)內(nèi)存資源的占用,可以用Unload方法把它從內(nèi)存卸出;同樣地,不能用Unload卸出下標(biāo)為0的菜單項(xiàng)。
彈出式菜單的實(shí)現(xiàn)(PopupMenuMethod)
VB中在菜單設(shè)計(jì)窗口(MenuDesignWindow)中設(shè)計(jì)的菜單是下拉式菜單。下拉式菜單是用戶在任何時(shí)候都可以在頂端菜單條上選擇后拉出的菜單,而彈出式菜單則是在程序界面的一定區(qū)域內(nèi)點(diǎn)按鼠標(biāo)鍵后出現(xiàn)的菜單。在某些情況下,彈出式菜單會(huì)使系統(tǒng)功能的實(shí)現(xiàn)更加簡潔和高效,使用起來更加得心應(yīng)手。
Widnows程序的彈出式菜單一般是當(dāng)用戶在程序的桌面上點(diǎn)按鼠標(biāo)鍵時(shí)出現(xiàn)的。彈出式菜單多用于實(shí)現(xiàn)系統(tǒng)的附加或增強(qiáng)功能。彈出式菜單的內(nèi)容,可以隨點(diǎn)按鼠標(biāo)鍵的位置不同而變化。由于彈出的菜單要覆蓋屏幕的一部分,所以應(yīng)盡量縮短菜單里的文字。
在VB中,彈出式菜單的實(shí)現(xiàn)要用到下拉式菜單設(shè)計(jì)的技術(shù)和PopupMenu方法。具體的做法是:
在菜單設(shè)計(jì)窗口(MenuDesignWindow)里設(shè)計(jì)好相應(yīng)窗體的彈出式菜單。要注意的是,要彈出的菜單必須至少有一個(gè)子菜單;因而這個(gè)菜單不能有快捷鍵,并且Checked屬性必須是False。再把彈出式菜單的Visible屬性改為False。
在具有設(shè)計(jì)好的彈出式菜單的窗體的Form_Click中加入以下代碼(假設(shè)彈出式菜單的Name屬性是mnuExample):
SubForm_Click()
PopupMenumnuExample
EndSub
如果要求只有按下鼠標(biāo)左鍵或者右鍵才能激活菜單,就必須在Form_MouseDown里加入如下代碼:
SubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
IfButton=2thenButton=2表示鼠標(biāo)右鍵
PopupMenumnuExample
EndIf
PopupMenu的完整句法是:
[Form.]PopupMenumenuname[flags[,x[,y]]]
改變flags的值可以控制彈出式菜單的表現(xiàn)形式。Flags有兩組值。第一組值用來控制菜單的顯示方式,包括POPUPMENU_LEFTALIGNPOPUPMENU_CENTERALIGN,POPUPMENU_RIGHTALIGN,分別表示以x為左邊界,以x為中心和以x為右邊界的顯示方式,并且以x為左邊界是缺省的方式;另外一組值用來控制菜單項(xiàng)的選中方式,包括POPUPMENU_LEFTBUTTON和POPUPMENU_RIGHTBUTTON,分別表示左鍵選中和左/右鍵選中均可,并且左鍵選中是缺省的方式。Flags的值由上面的兩組值經(jīng)過OR運(yùn)算得出。例如,要求左對(duì)齊顯示并且左鍵選中為準(zhǔn),則應(yīng)有:
flags=POPUPMENU_LEFTALIGNORPOPUPMENU_LEFTBUTTON
x和y用來定義菜單彈出的位置、缺省是鼠標(biāo)點(diǎn)中的位置。
菜單項(xiàng)的其他屬性
用ALT+字母鍵激活頂層菜單,或者在菜單激活后用字母鍵激活一個(gè)菜單項(xiàng),必須學(xué)會(huì)使用&。&用在菜單項(xiàng)的標(biāo)題屬性(Caption)里。它的用法和作用與在用C語言編制的Windows程序中的用法和作用相同。
有時(shí)希望頂層菜單之間的間隔大一些,或者某個(gè)頂層菜單出現(xiàn)在菜單條的最右端,這時(shí)就要用到標(biāo)題屬性是空格的菜單。如果一個(gè)菜單的標(biāo)題是由多個(gè)空格組成的,那么這個(gè)菜單在菜單條上就占用跟空格的個(gè)數(shù)相應(yīng)的空間,并且它后面的菜單也順序地后移;如果這個(gè)菜單的Visible屬性是False,那么它就跟不存在一樣。
窗口設(shè)計(jì)的原則和舉例
下面是一個(gè)浮動(dòng)窗口技術(shù)的例子。為了引起用戶的注意,或者必須保證含有重要信息的窗口不被其他窗口覆蓋,就要用到浮動(dòng)窗口技術(shù),建立一個(gè)“總在最前面”(TopMost)的窗口。具體的做法是:
(1)在VB程序中加入如下的聲明:
DeclareFunctionSetWindowPosLib"user"(Byvalh%,Byvalhb%,Byvalx%,Byvaly%,By
valcx%,Byvalcy%,Byvalf%)AsInteger
GlobalConstSWP_NOMOVE=2
GlobalConstSWP_NOSIZE=1
GlobalConstHWND_MOST=?1
GlobalConstHWND_NOMOST=?2
GlobalConstFLAGS=SWP_NOMOVEOrSWP_NOSIZE
(2)假設(shè)要把窗體frmExample設(shè)置成總在最前面的窗口,只要在frmExample窗體的Form_Load
過程里加入以下代碼:
Dimsuccess%
success=SetWindowPos(frmExample.hWnd,HWND_MOST,0,0,0,0,FLAGS)
如果要取消總在最前面的特性,則可以執(zhí)行如下的代碼:
success=SetWindowPos(frmExample.hWnd,HWND_NOMOST,0,0,0,0,FLAGS)
success不等于0表示SetWindowPos執(zhí)行成功。
在MDI程序里,有一個(gè)窗口是所有其他窗口的父窗口,各個(gè)子窗口完成相對(duì)獨(dú)立的功能,就像是多個(gè)獨(dú)立的工具組合起來一樣。在這方面,MSWord和Windows的FileManager是的例子。

