在VB裡,MDI(MultipleDocumentInterface,多窗口程式)窗體是這樣定義的:「MDI窗體作為一個程式的後台窗口,包含著MDIChild屬性為True的窗體」。在一個VB程式中,至多只能存在一個MDI父窗體,可以有多個MDI子窗體;建立一個MDI父窗體的方法是在VB的File選單裡選擇「NewMDIForm」。
在MDI程式運作時,如果子視窗具有選單,那麼當子視窗被啟動時,子視窗的選單就會自動取代父視窗選單;當子視窗被最小化時,在MDI父視窗裡就會出現子視窗的圖標。
Windows的通用圖形介面的出現,讓電腦使用者不必透過專門的學習就可以得心應手地使用各種Windows的軟體;不僅如此,它還是程式設計者在設計Windows程式的介面時所必須遵循的標準,這在很大程度上減輕了程式設計者的負擔,使他們能夠把主要精力放在問題的求解和實現上。
VisualBasic的出現,更簡化了Windows程式介面的設計工作,只需要極少量的程式碼,就能實現標準Windows應用程式的介面。但是,如果不了解Windows程式介面設計的原則,或是不熟悉VB下介面程式設計的技巧,就難以設計和實現既符合一般標準又具有特色的介面。介面設計的原則介面設計具有一般性的原則,最為重要的有:
介面要具有一致性。一致性原則在介面設計中最容易被違反,同時也最容易修改和避免。例如,在選單和線上說明中必須使用相同的術語;對話方塊必須具有相同的風格。
常用操作要有捷徑。常用操作的使用頻度大,應該可以減少操作序列的長度。例如,為檔案的常用操作如開啟、磁碟機、另存等設定快速鍵。使常用操作具有捷徑,不僅會提高使用者的工作效率,還使得介面在功能實現上簡潔和高效。
提供簡單的錯誤處理。系統要有錯誤處理的功能。當出現錯誤時,系統應該能偵測出錯誤,並且提供簡單和容易理解的錯誤處理的功能。錯誤出現後系統的狀態不會發生變化,或系統要提供錯誤恢復的指導。
提供資訊回饋。對操作人員的重要操作要有資訊回饋。對常用操作和簡單操作的回饋可以不作要求,但是對不常用操作和至關重要的操作,系統應該提供資訊的回饋。
操作可逆。操作應該可逆。這對於不具備專門的知識的操作人員相當有用。可逆的動作可以是單一的操作,或是者一個相對獨立的操作序列。
設計良好的線上幫助。雖然對於熟練用戶來說,線上幫助並非必不可少,但是對於大多數不熟練用戶來說,線上幫助具有非常重要的作用。
菜單設計的原則與編程
菜單設計有以下的一般原則:
依照系統的功能來組織選單。
要選用廣而淺的菜單樹,而不是窄而深的菜單樹。
根據選單選項的含義進行分組;並且按一定的規則排序。選單選項的標題要力求簡短、意義明確,並且最好以關鍵字開始。
常用選項要設定快捷鍵。結合以上的原則,菜單程式設計有以下幾方面的技術和技巧:
選單選項的分組
在VB中,選單選項的分組是透過選單列分隔橫線實現的。在選單的某個位置增加一個Caption屬性為「」的選單項目,它在選單上就表現為一條橫線。在許多情況下,同一個功能選單下又可以依照選單選項的功能分成幾組,這時就可以用分隔橫線來實現選單項目的分組。
常用選項快捷鍵的設定
開啟選單設計視窗(MenuDesignWindow),應對於每個選單選項有對應的快捷鍵(Shortcut)列表,在該表中選擇一個即可。需要注意的是,具有子選單的選單或頂層選單的快速鍵不能這樣定義。依照Windows的介面設計原則,頂層選單的快速鍵的形式是Alt 字母鍵。它的實現方法在後文另敘。
對於一些常用的功能選單項,有約定俗成的快速鍵。例如,檔案開啟用CTRL O,檔案記憶體用CRTL S,列印用CTRL P,等等。
為選單選項定義好快捷鍵之後,選單上該選項的後面就出現了快捷鍵的文字表示。
選單選項的啟用與禁止、可見與隱藏為了表示選單選項的一些特殊功能,可能要用到選單選項的啟用與禁止、可見與隱藏屬性。當因為某些原因使得某個選項所代表的功能不能被實現時,就應該禁止該選項被選取。選單選項的啟用與禁止是透過改變改選項的Enabled屬性來實現的。舉例來說,假設選單選項名為nmuName,禁止該選項可以如下實作:
mnuName.Enabled=False
同理,隱藏一個選項可以用
mnuName.Visible=False
來實現,而使一個隱藏的選項恢復可見則用
mnuName.Visible=True
實現。
選單項目的隱藏與恢復可見常用在動態選單的實作中。
選單項目的動態裝入
選單項目的動態裝入是指選單項目的個數不固定,並且能夠在需要時動態地裝入。最簡單的例子就是文件選單中最近開啟的文件的清單。在第一次開啟檔案之前,該清單是空的,並且不在檔案選單中出現;開啟一個檔案後,該清單不再是空的,並且檔案選單中出現代表被開啟檔案的選單項目。
在上面的例子裡,就綜合運用了選單項目的下標屬性(Index)、標題屬性(Caption)、可見屬性(Visible)以及選單項目的裝入方法(LoadMethod)。
具體的實現過程如下:
在檔案選單裡增加一個選單項,標題任意,並假設選單項目的Name屬性是opened_files_list;
更改選單項目opened_files_list的可見屬性,使opened_files_list.Visible=False
更改選單項目opened_files_list的下標屬性,使
opened_files_files_list.Index=0
在程式中控制選單項目opened_files_list的動態裝入。
假設要顯示開啟的第二檔的檔名,並且該檔名存放在一個檔名陣列opened_file_name裡。以下的程式碼就實現了這項功能:
Loadopened_files_list(1)
opened_files_lise(1).Caption="&2" opened_file_name(1)
opened_files_list(1).Visible=True
要注意的是,對於下標為0的選單項,不能用Load方法。因為在程式執行時,該選單項目就已經被裝入到記憶體裡了;另外,在選單項目的標題屬性字元裡的「&」字元具有特殊的意義,它的作用是在顯示該屬性字串的同時,不會顯示“&”本身,而緊接“&”的字元在顯示時具有下劃線,並且該字元成為熱鍵。
如果下標不為0的選單項目不再需要,為了減少對記憶體資源的佔用,可以用Unload方法把它從記憶體卸出;同樣地,不能用Unload卸出下標為0的選單項目。
彈出式選單的實作(PopupMenuMethod)
VB中在選單設計視窗(MenuDesignWindow)中設計的選單是下拉式選單。下拉式選單是使用者在任何時間都可以在頂端選單條上選擇後拉出的選單,而彈出式選單則是在程式介面的一定區域內點按滑鼠鍵後出現的選單。在某些情況下,彈出式選單會使系統功能的實現更加簡潔和高效,使用起來更加得心應手。
Widnows程式的彈出式選單一般是當使用者在程式的桌面上點按滑鼠鍵時出現的。彈出式選單多用於實現系統的附加或增強功能。彈出式選單的內容,可以隨點按滑鼠鍵的位置不同而變化。由於彈出的選單要覆蓋螢幕的一部分,所以應盡量縮短選單裡的文字。
在VB中,彈出式選單的實作要用到下拉式選單設計的技術和PopupMenu方法。具體的做法是:
在選單設計視窗(MenuDesignWindow)裡設計好對應窗體的彈出式選單。要注意的是,要彈出的選單必須至少有一個子選單;因而這個選單不能有快捷鍵,且Checked屬性必須是False。再把彈出式選單的Visible屬性改為False。
在具有設計好的彈出式選單的窗體的Form_Click中加入以下程式碼(假設彈出式選單的Name屬性是mnuExample):
SubForm_Click()
PopupMenumnuExample
EndSub
如果要求只有按下滑鼠左鍵或右鍵才能啟動選單,就必須在Form_MouseDown裡加入以下程式碼:
SubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
IfButton=2thenButton=2表示滑鼠右鍵
PopupMenumnuExample
EndIf
PopupMenu的完整句法是:
[Form.]PopupMenumenuname[flags[,x[,y]]]
改變flags的值可以控制彈出式選單的表現形式。 Flags有兩組值。第一組值用來控制選單的顯示方式,包括POPUPMENU_LEFTALIGNPOPUPMENU_CENTERALIGN,POPUPMENU_RIGHTALIGN,分別表示以x為左邊界,以x為中心和以x為右邊界的顯示方式,並且以x為左邊界是缺省的方式;另外一組值用來控制選單項目的選取方式,包括POPUPMENU_LEFTBUTTON和POPUPMENU_RIGHTBUTTON,分別表示左鍵選取和左/右鍵選取均可,且左鍵選取為缺省的方式。 Flags的值由上面的兩組值經過OR運算得出。例如,要求左對齊顯示並且左鍵選取為準,則應有:
flags=POPUPMENU_LEFTALIGNORPOPUPMENU_LEFTBUTTON
x和y用來定義選單彈出的位置、預設是滑鼠點中的位置。
選單項目的其他屬性
用ALT 字母鍵啟動頂層選單,或在選單啟動後用字母鍵啟動一個選單項,必須學會使用&。 &用在選單項目的標題屬性(Caption)裡。它的用法和作用與在用C語言編製的Windows程式中的用法和作用相同。
有時希望頂層選單之間的間隔大一些,或是某個頂層選單出現在選單列的最右端,這時就要用到標題屬性是空格的選單。如果一個選單的標題是由多個空格組成的,那麼這個選單在選單列上就佔用跟空格的個數對應的空間,而且它後面的選單也順序地後移;如果這個選單的Visible屬性是False ,那麼它就跟不存在一樣。
視窗設計的原則與舉例
下面是一個浮動視窗技術的例子。為了吸引使用者的注意,或必須確保含有重要資訊的視窗不被其他視窗覆蓋,就要用到浮動視窗技術,建立一個「總在最前面」(TopMost)的視窗。具體的做法是:
(1)在VB程序中加入如下的聲明:
DeclareFunctionSetWindowPosLib"user"(Byvalh,Byvalhb,Byvalx,Byvaly,By
valcx,Byvalcy,Byvalf)AsInteger
GlobalConstSWP_NOMOVE=2
GlobalConstSWP_NOSIZE=1
GlobalConstHWND_TOPMOST=1
GlobalConstHWND_NOTOPMOST=2
GlobalConstFLAGS=SWP_NOMOVEOrSWP_NOSIZE
(2)假設要把窗體frmExample設定成總在最前面的窗口,只要在frmExample窗體的Form_Load
過程裡加入以下程式碼:
Dimsuccess
success=SetWindowPos(frmExample.hWnd,HWND_TOPMOST,0,0,0,0,FLAGS)
如果要取消總在最前面的特性,則可以執行如下的程式碼:
success=SetWindowPos(frmExample.hWnd,HWND_NOTOPMOST,0,0,0,0,FLAGS)
success不等於0表示SetWindowPos執行成功。
在MDI程式裡,有一個窗口是所有其他窗口的父窗口,各個子窗口完成相對獨立的功能,就像是多個獨立的工具組合起來一樣。在這方面,MSWord和Windows的FileManager就是最好的例子。 ->