工具欄
可以用工具欄進(jìn)一步增強(qiáng)應(yīng)用程序的菜單界面。工具欄含有工具欄按鈕,它提供了對于應(yīng)用程序中最常用的命令的快速訪問。例如:Visual Basic 的工具欄含有執(zhí)行常用命令的 ToolBarButton,如“打開”(打開已存在的工程)、“保存”(存儲當(dāng)前的工程),等等。
創(chuàng)建工具欄
工具欄(也稱為發(fā)條或者控制欄)已經(jīng)成為許多基于 Windows 的應(yīng)用程序的標(biāo)準(zhǔn)功能。工具欄提供了對于應(yīng)用程序中最常用的菜單命令的快速訪問。使用 ToolBar 控件來創(chuàng)建工具欄非常容易且很方便,它在 Visual Basic的專業(yè)版與企業(yè)版中是可用的。如果使用的是 Visual Basic 學(xué)習(xí)版,則可以像本章后面的“協(xié)調(diào)菜單與工具欄的外觀”所描述的那樣用手工來創(chuàng)建工具欄。
下列示例演示為 MDI 應(yīng)用程序創(chuàng)建工具欄的過程;在標(biāo)準(zhǔn)窗體上創(chuàng)建一個工具欄的過程基本上一樣。
要手工創(chuàng)建工具欄,請按照以下步驟執(zhí)行:
1. 在 MDI 窗體上放置一個圖片框。圖片框的寬度會自動伸展,直到填滿 MDI 窗體工作空間。工作空間就是窗體邊框以內(nèi)的區(qū) 域,不包括標(biāo)題條、菜單欄或所有的工具欄、狀態(tài)欄或者可能在窗體上的滾動條。
注意 只能把那些直接支持 Align 屬性的控件放置在 MDI 窗體上(圖片框是支持這一屬性的的標(biāo)準(zhǔn)控件)。
2. 在圖片框中,可以放置任何想在工具欄上顯示的控件。典型地,用 CommandButton 或 Image 控件來創(chuàng)建工具欄按鈕。圖 6.16表示出了一個含有 Image 控件的工具欄。
要在圖片框中添加控件,單擊工具欄中的控件按鈕,然后在圖片框中畫出它。
注意 當(dāng) MDI 窗體中包含了圖片框時,該 MDI 窗體的內(nèi)部區(qū)域不包括圖片框在內(nèi)。例如:MDI 窗體的 ScaleHeigh 屬性返回 MDI 窗體的內(nèi)部高度,這個高度已不包括圖片框的高度。
3. 設(shè)置設(shè)計時屬性。
使用工具欄的一個好處是可以顯示一個形象的命令圖示。Image 控件是作為工具欄按鈕的一個很好的選擇,因為可以用它來顯示一個位圖。在設(shè)計時設(shè)置其 Picture 屬性來顯示一個位圖;這樣,當(dāng)該按鈕被單擊時,即能提供一個命令執(zhí)行的可見信息。也可以通過設(shè)置按鈕的 ToolTipText屬性來使用工具提示,這樣,當(dāng)用戶把鼠標(biāo)指針保持在一個按鈕上時,就可以顯示出該工具欄按鈕的名稱。
4. 編寫代碼
因為工具欄頻繁地用于提供對其它命令的快捷訪問,因而在大部分時間內(nèi)都是從每一個按鈕的 Click 事件中調(diào)用其它過程,比如對應(yīng)的菜單命令。
提示 可用一個不顯示工具欄的 MDI 窗體來使用在運(yùn)行時不可見的控件(比如 Timer 控件)。為了做到這一點,在 MDI 窗體上放置一個圖片框,把控件放到圖片框中,然后把圖片框的 Visible 屬性設(shè)置為 False。
編寫工具欄的代碼
工具欄用于提供訪問某些應(yīng)用程序命令的快捷方法。例如:圖 6.16 中工具欄上的第一個按鈕就是“新建文件”命令的快捷鍵?,F(xiàn)在,可以在 MDINotePad 示例應(yīng)用程序中三個地方請求創(chuàng)建新文件。
1.在 MDI 窗體上(MDI 窗體上“文件”菜單中的“新建”命令)。
2.在子窗體上(在子窗體“文件”菜單上的“新建”命令)。
3.在工具欄上(“新建文件”按鈕)。
與其把這個代碼重復(fù)三次,還不如從子窗體的 mnuFileNew_Click 事件取出原代碼,然后把它放入子窗體的一個公用過程中??梢詮纳厦嫒魏我粋€事件過程調(diào)用這個過程。以下是一個示例:
'這個例程在公共過程中。
Public Sub FileNew ()
Dim frmNewPad As New frmNotePad
frmNewPad.Show
End Sub
'在子窗體的“文件”菜單上選取“新建”。
Private Sub mnuchildFileNew_Click ()
FileNew
End Sub
'在 MDI 窗體的“文件”菜單上選取“新建”。
Private Sub mnumdiFileNew_Click ()
frmNotePad.FileNew
End Sub
'在工具欄上單擊“新建文件”按鈕。
Private Sub btnFileNew_Click ()
frmNotePad.FileNew
End Sub
協(xié)調(diào)菜單與工具欄的外觀
當(dāng)由其它應(yīng)用程序提供的對象在窗體中被激活時,有許多方法讓對象的菜單與工具欄出現(xiàn)在容器窗體內(nèi);然而,需要規(guī)定它們將如何顯示。這一過程叫做用戶界面協(xié)調(diào),因為 Visual Basic 與已經(jīng)鏈接或嵌入的對象必須協(xié)調(diào)容器窗體中的空間。
控制菜單的外觀
通過設(shè)置窗體的 NegotiateMenus 屬性可以決定一個鏈接或嵌入的對象的菜單是否出現(xiàn)在容器窗體中。如果子窗體的 NegotiateMenus 屬性置為 True(缺省),而且容器有一個定義的菜單欄,那么,當(dāng)這個對象被激活時,它的菜單就放置在容器的菜單欄中。如果容器沒有菜單欄,或者NegotiateMenus 屬性被設(shè)置為 False,那么,當(dāng)這個對象激活時對象的菜單將不出現(xiàn)。
注意 NegotiateMenus 屬性不適用于 MDI 窗體。
控制工具欄的外觀
MDI 窗體的 NegotiateToolbars 屬性決定了鏈接或嵌入對象的工具欄是不固定的調(diào)色板還是被放置在父窗體上。這種性能不要求工具欄出現(xiàn)在 MDI 父窗體上。如果 MDI 窗體的 NegotiateToolbars 屬性設(shè)為 True,則對象的工具欄出現(xiàn)在 MDI 父窗體上。如果 NegotiateToolbars 設(shè)為 False,則對象的工具欄就為不固定的調(diào)色板。
注意 NegotiateToolbars 屬性只用于 MDI 窗體。
如果 MDI 窗體包含工具欄,它通常被包含在父窗體的 PictureBox 控件中。圖片框的 Negotiate 屬性決定了被激活時容器的工具欄是繼續(xù)顯示還是被對象的工具欄所代替。如果 Negotiate 設(shè)置為 True,則除了容器的工具欄外還顯示對象的工具欄。如果 Negotiate 設(shè)置為 False,則對象的工具欄代替容器的工具欄。
注意 菜單與工具欄的協(xié)調(diào)只發(fā)生在支持現(xiàn)場激活的可插入對象之上。有關(guān)現(xiàn)場激活的詳細(xì)信息,請參閱第十章“用部件編程”。用以下過程可以看到這三個屬性如何交互作用。
要執(zhí)行菜單與工具欄的協(xié)調(diào),請按照以下步驟執(zhí)行:
1. 在 MDI 窗體中添加工具欄。這在本章前面的“創(chuàng)建工具欄”中描述過。
2. 在子窗體上放置一個可插入的對象。
3. 設(shè)置 NegotiateMenus、NegotiateToolbars 以及 Negotiate 屬性。
4. 運(yùn)行此應(yīng)用程序,然后雙擊該對象。
對話框
在基于 Windows 的應(yīng)用程序中,對話框被用來:
提示用戶提供應(yīng)用程序繼續(xù)執(zhí)行所需要的數(shù)據(jù)。
向用戶顯示信息。
例如,在 Visual Basic 中,用“打開文件”對話框來顯示已存在的工程。VisualBasic 中的“關(guān)于”對話框也是一個如何使用對話框來顯示信息的例子。在菜單欄上單擊“幫助”,選擇“關(guān)于 Visual Basic”菜單項,則顯示“關(guān)于”對話框。
模式與無模式的對話框
對話框不是模式就是無模式的。模式對話框,在可以繼續(xù)操作應(yīng)用程序的其他部分之前,必須被關(guān)閉(隱藏或卸載)。例如,如果一個對話框,在可以切換到其它窗體或?qū)υ捒蛑耙笙葐螕簟按_定”或“取消”,則它就是模式的。
Visual Basic 中的“關(guān)于”對話框是模式的。顯示重要消息的對話框總應(yīng)當(dāng)是模式的——那就是說,在繼續(xù)做下去之前,總是要求用戶應(yīng)當(dāng)先關(guān)上對話框或者對它的消息作出響應(yīng)。
無模式的對話框允許在對話框與其他窗體之間轉(zhuǎn)移焦點而不用關(guān)閉對話框。當(dāng)對話框正在顯示時,可以在當(dāng)前應(yīng)用程序的其他地方繼續(xù)工作。無模式對話框很少使用。Visual Basic 中“編輯”菜單中的“查找”對話框就是一個無模式對話框的實例。無模式對話框用于顯示頻繁使用的命令與信息。
要將窗體作為模式對話框顯示,請
1.使用 Show 方法,其 style 參數(shù)值為 vbModal(一個值為 1 的常數(shù))。例如:
'將 frmAbout 作為模式對話框顯示。
frmAbout.Show vbModal
要將窗體作為無模式對話框顯示,請
2.使用不帶 style 參數(shù)的 Show方法。
例如:
'將 frmAbout 作為無模式對話框顯示。
frmAbout.Show
注意 如果窗體顯示為模式對話框,則只有當(dāng)對話框關(guān)閉之后,在 Show 方法后的代碼才能執(zhí)行。然而,當(dāng)窗體被顯示為無模式對話框時,在該窗體顯示出來以后,Show 方法后面的代碼緊接著就會執(zhí)行。
Show 方法另有一個可選參數(shù),owner,可用來指定窗體的父子關(guān)系??蓪⒛硞€窗體名傳給這個參數(shù),使得這個窗體成為新窗體的擁有者。要顯示一個窗體,作為另一個窗體的子窗體,請
這里 Show 方法有兩個參數(shù):style 和 owner。
例如:
' 將 frmAbout 顯示為 frmMain 的無模式子窗體。
frmAbout.Show vbModeless, frmMain
在 Show 方法中使用 owner 參數(shù),確保對話框在它的父窗體最小化時它也最小化,或者在其父窗體關(guān)閉時它也卸載。
預(yù)定義對話框的使用
在應(yīng)用程序中添加對話框最容易的方法是使用預(yù)定義對話框,因為不必考慮設(shè)計、裝載或者顯示對話框方面的問題。然而,控件在其外觀上要受到限制。預(yù)定義的對話框總是模式的。
下表列出了 Visual Basic 應(yīng)用程序中添加預(yù)定義對話框時能使用的函數(shù)。
用輸入框來提示輸入
應(yīng)用 InputBox 函數(shù)請求提供數(shù)據(jù)。這個函數(shù)顯示要求輸入數(shù)據(jù)的模式對話框。圖 6.17 所示的文本輸入框提示輸入要打開文件的名稱。
以下代碼顯示圖 6.17 中所示的輸入框。
FileName = InputBox("Enter file to open:", "File Open")
注意 切記當(dāng)使用 InputBox 函數(shù)時,對對話框的各部分的控制非常有限。只能改變標(biāo)題欄中的文本、顯示給用戶的命令提示、對話框在屏幕上的位置以及它是否顯示一個“幫助”按鈕。
詳細(xì)信息 請參閱《語言參考》的“InputBox 函數(shù)”。
用消息對話框顯示信息
可以用 MsgBox 函數(shù)獲得“是”或者“否”的響應(yīng),并顯示簡短的消息,比如:錯誤、警告或者對話框中的期待。看完這些消息以后,可選取一個按鈕來關(guān)閉該對話框。
如果文件不能打開,那么名為 Text Editor 的應(yīng)用程序就會顯示如圖 6.18 所示的消息對話框。
以下代碼顯示如圖 6.18 所示的消息框:
MsgBox "Error encountered while trying to open file, _
please retry.", vbExclamation, "Text Editor"
注意 所謂模式的,既可以局限于應(yīng)用程序中,也可以局限于系統(tǒng)中。如果消息框的模式局限在應(yīng)用程序中(缺?。瑒t在這個對話框未消失之前不能切換到該應(yīng)用程序的其他部分,但是可以切換到其他應(yīng)用程序。在消息框未消失之前系統(tǒng)的模式消息框不允許切換到別的應(yīng)用程序。
詳細(xì)信息 請參閱《語言參考》的“MsgBox 函數(shù)”。
用窗體作為自定義對話框
自定義對話框就是用戶所創(chuàng)建的含有控件的窗體——這些控件包括命令按鈕、選取按鈕和文本框——它們可以為應(yīng)用程序接收信息。通過設(shè)置屬性值來自定義窗體的外觀。也可以編寫在運(yùn)行時顯示對話框的代碼。
要創(chuàng)建自定義對話框,可以從新窗體著手,或者自定義現(xiàn)成的對話框。如果重復(fù)過多,可以建造能在許多應(yīng)用程序中使用的對話框的集合。
要自定義現(xiàn)存的對話框,請按照以下步驟執(zhí)行:
1. 從“工程”菜單中選取“添加窗體”,在工程中添加一現(xiàn)存的窗體。
2. 從“文件”菜單中選取“filename 另存為”并輸入新的文件名(這可以防止改變已存在的窗體版本)。
3. 根據(jù)需要自定義窗體的外觀。
4. 在代碼窗口中自定義事件過程。
要創(chuàng)建新的對話框,請按照以下步驟執(zhí)行:
1. 從“工程”菜單中選取“添加窗體”。
- 或者 -
在工具欄上單擊“窗體”按鈕,創(chuàng)建新的窗體。
2. 如有必要,自定義窗體外觀。
3. 在“代碼”窗口中自定義事件過程。
有很大的自由來定義自定義對話框的外觀。它可以是固定的或可移動的、模式或無模式的。它可以包含不同類型的控件;然而,對話框通常不包括菜單欄、窗口滾動條、最小化與化按鈕、狀態(tài)條或者尺寸可變的邊框。本主題余下的部分將討論創(chuàng)建典型類型的對話框方法。
添加標(biāo)題
對話框總應(yīng)當(dāng)有標(biāo)識它的標(biāo)題。要創(chuàng)建標(biāo)題,設(shè)置該窗體的 Caption 屬性為將在標(biāo)題條中顯示的文本字符串。通常,這一步是在設(shè)計時使用“屬性”窗口來完成的,但也可以用代碼來完成這一步。例如:
frmAbout.Caption = "About"
提示 如果想完全刪除此標(biāo)題欄,可以設(shè)置窗體的 ControlBox、MinButton 和MaxButton 為 False;設(shè)置 BorderStyle 為尺寸不可變的設(shè)置(0、1 或 3),并設(shè)置 Caption 為空字符串 ("")。
設(shè)置標(biāo)準(zhǔn)對話框的屬性
一般來說,用戶響應(yīng)對話框時,先提供信息,然后用“確定”或者“取消”命令按鈕關(guān)閉對話框。因為對話框是臨時性的,用戶通常不需要對它進(jìn)行移動、改變尺寸、化或最小化等操作。其結(jié)果是:隨新窗體出現(xiàn)的可變尺寸邊框類型、“控制”菜單框、“化”按鈕以及“最小化”按鈕,在大多數(shù)對話框中都是不需要的。
通過設(shè)置 BorderStyle、ControlBox、MaxButton 和 MinButton 屬性,可以刪除這些項目。例如,“關(guān)于”對話框可能使用以下的屬性設(shè)置。
記住,如果刪除“控制”菜單框 ( ControlBox = False ),則必須向用戶提供退出該對話框的其它方法。實現(xiàn)的辦法通常是在對話框中添加“確定”、“取消”或者“退出”命令按鈕,并在隱藏或卸載該對話框的 Click 按鈕事件中添加代碼。
添加和放置命令按鈕
模式對話框必須至少包含一個退出該對話框的命令按鈕。通常用兩個命令按鈕:其中一個按鈕開始動作,而另一個按鈕關(guān)閉該對話框而不做任何改變。典型狀態(tài)是,這兩個按鈕的 Caption 屬性設(shè)置“確定”與“取消”。在這個方案中,“確定”命令按鈕的 Default 屬性設(shè)置為 True,而 Cancel 命令按鈕的 Cancel 屬性設(shè)置為 True。雖然“確定”與“取消”是最常用的按鈕,其他的按鈕標(biāo)題組合也可使用。
顯示消息的對話框通常使用 Label 控件來顯示錯誤消息或者命令提示,并且用一至兩個命令按鈕來執(zhí)行動作。例如,也許給標(biāo)識的 Caption 屬性賦以錯誤消息或者命令提示,而給兩個命令按鈕控件的 Caption 屬性指定“是”與“否”。當(dāng)用戶選取“是”,則發(fā)生一個動作,當(dāng)選取“否”時,則發(fā)生另一個動作。
這種類型對話框的命令按鈕通常被放置在對話框的底部或右邊,而頂部或左邊的按鈕為缺省按鈕,如圖 6.19 所示。
設(shè)置缺省、取消和焦點
命令按鈕控件提供了以下的屬性:
Default
Cancel
TabIndex
TabStopDefault
按鈕就是當(dāng)用戶按下 ENTER 鍵時選中的按鈕。在一個窗體上,只能有一個命令按鈕的 Default 屬性可以設(shè)置為 True。按下 ENTER 鍵就調(diào)用缺省命令按鈕的 Click 事件。這個功能連同編輯控件(比如 TextBox )一起工作。例如,可以在文本框中鍵入數(shù)據(jù),然后按下 ENTER 鍵來產(chǎn)生Click 事件,以取代選取“確定”按鈕。
“取消”按鈕就是當(dāng)按下 ESC 鍵時選中的按鈕。在一個窗體上,只能有一個命令按鈕的 Cancel 屬性可以設(shè)置為 True。按下 ESC 鍵調(diào)用“取消”命令按鈕的 Click 事件。“取消”按鈕也可以為缺省命令按鈕。要指定對話框的“取消”按鈕,設(shè)置該命令按鈕的 Cancel 屬性為 True。
提示 一般說來,代表最可靠的或者最安全的操作的按鈕應(yīng)當(dāng)是缺省按鈕。例如,在“文本替換”對話框中,“取消”應(yīng)當(dāng)是缺省按鈕,而不是“全部替換”。
也可以指定當(dāng)對話被顯示時具有焦點的按鈕。當(dāng)窗體被顯示時,帶有最低的 TabIndex 設(shè)置的控件接收焦點。按下 ENTER 鍵會調(diào)用缺省命令按鈕或者有焦點的命令按鈕的 Click 事件。要在窗體被顯示時將焦點給某個命令按鈕,則設(shè)置該命令按鈕的 TabIndex 為 0,它的 TabStop 屬性為 True。也可以用 SetFocus 方法在窗體被顯示時將焦點給指定的控件。
詳細(xì)信息 請參閱《語言參考》的“TabIndex 屬性”與“TabStop 屬性”。
使對話框上的控件無效
有時候需要使控件無效,因為它們的動作在當(dāng)前的上下文中不適用。例如,當(dāng) Visual Basic 的“查找”對話框第一次顯示時,“查找下一個”按鈕應(yīng)無效,如圖 6.20 所示。設(shè)置對話上的控件的 Enabled 屬性為 False,可以使其無效。
要使對話框上的控件無效,請
1.設(shè)置每個控件的 Enabled 屬性為 False。例如:
cmdFindNext.Enabled = False
cmdReplace.Enabled = False
顯示自定義對話框
使用應(yīng)用程序中顯示其他窗體同樣的方法來顯示對話框。當(dāng)應(yīng)用程序運(yùn)行時,啟動窗體會自動裝入。想在應(yīng)用程序中出現(xiàn)第二個窗體或?qū)υ捒?,要用裝入并顯示它的代碼來實現(xiàn)。同樣,想要窗體或?qū)υ捒蛳В惨帉懶遁d或隱藏它的代碼。
以下代碼在用戶選取“幫助”菜單中的“關(guān)于”菜單項時顯示“關(guān)于”對話框。
Private Sub mnuHelpAbout_Click ()
'此處用 style = vbModal 的 Show 方法將對話框顯示為模式的。
frmAbout.Show vbModal
End Sub
可以用工具欄進(jìn)一步增強(qiáng)應(yīng)用程序的菜單界面。工具欄含有工具欄按鈕,它提供了對于應(yīng)用程序中最常用的命令的快速訪問。例如:Visual Basic 的工具欄含有執(zhí)行常用命令的 ToolBarButton,如“打開”(打開已存在的工程)、“保存”(存儲當(dāng)前的工程),等等。
創(chuàng)建工具欄
工具欄(也稱為發(fā)條或者控制欄)已經(jīng)成為許多基于 Windows 的應(yīng)用程序的標(biāo)準(zhǔn)功能。工具欄提供了對于應(yīng)用程序中最常用的菜單命令的快速訪問。使用 ToolBar 控件來創(chuàng)建工具欄非常容易且很方便,它在 Visual Basic的專業(yè)版與企業(yè)版中是可用的。如果使用的是 Visual Basic 學(xué)習(xí)版,則可以像本章后面的“協(xié)調(diào)菜單與工具欄的外觀”所描述的那樣用手工來創(chuàng)建工具欄。
下列示例演示為 MDI 應(yīng)用程序創(chuàng)建工具欄的過程;在標(biāo)準(zhǔn)窗體上創(chuàng)建一個工具欄的過程基本上一樣。
要手工創(chuàng)建工具欄,請按照以下步驟執(zhí)行:
1. 在 MDI 窗體上放置一個圖片框。圖片框的寬度會自動伸展,直到填滿 MDI 窗體工作空間。工作空間就是窗體邊框以內(nèi)的區(qū) 域,不包括標(biāo)題條、菜單欄或所有的工具欄、狀態(tài)欄或者可能在窗體上的滾動條。
注意 只能把那些直接支持 Align 屬性的控件放置在 MDI 窗體上(圖片框是支持這一屬性的的標(biāo)準(zhǔn)控件)。
2. 在圖片框中,可以放置任何想在工具欄上顯示的控件。典型地,用 CommandButton 或 Image 控件來創(chuàng)建工具欄按鈕。圖 6.16表示出了一個含有 Image 控件的工具欄。
要在圖片框中添加控件,單擊工具欄中的控件按鈕,然后在圖片框中畫出它。
注意 當(dāng) MDI 窗體中包含了圖片框時,該 MDI 窗體的內(nèi)部區(qū)域不包括圖片框在內(nèi)。例如:MDI 窗體的 ScaleHeigh 屬性返回 MDI 窗體的內(nèi)部高度,這個高度已不包括圖片框的高度。
3. 設(shè)置設(shè)計時屬性。
使用工具欄的一個好處是可以顯示一個形象的命令圖示。Image 控件是作為工具欄按鈕的一個很好的選擇,因為可以用它來顯示一個位圖。在設(shè)計時設(shè)置其 Picture 屬性來顯示一個位圖;這樣,當(dāng)該按鈕被單擊時,即能提供一個命令執(zhí)行的可見信息。也可以通過設(shè)置按鈕的 ToolTipText屬性來使用工具提示,這樣,當(dāng)用戶把鼠標(biāo)指針保持在一個按鈕上時,就可以顯示出該工具欄按鈕的名稱。
4. 編寫代碼
因為工具欄頻繁地用于提供對其它命令的快捷訪問,因而在大部分時間內(nèi)都是從每一個按鈕的 Click 事件中調(diào)用其它過程,比如對應(yīng)的菜單命令。
提示 可用一個不顯示工具欄的 MDI 窗體來使用在運(yùn)行時不可見的控件(比如 Timer 控件)。為了做到這一點,在 MDI 窗體上放置一個圖片框,把控件放到圖片框中,然后把圖片框的 Visible 屬性設(shè)置為 False。
編寫工具欄的代碼
工具欄用于提供訪問某些應(yīng)用程序命令的快捷方法。例如:圖 6.16 中工具欄上的第一個按鈕就是“新建文件”命令的快捷鍵?,F(xiàn)在,可以在 MDINotePad 示例應(yīng)用程序中三個地方請求創(chuàng)建新文件。
1.在 MDI 窗體上(MDI 窗體上“文件”菜單中的“新建”命令)。
2.在子窗體上(在子窗體“文件”菜單上的“新建”命令)。
3.在工具欄上(“新建文件”按鈕)。
與其把這個代碼重復(fù)三次,還不如從子窗體的 mnuFileNew_Click 事件取出原代碼,然后把它放入子窗體的一個公用過程中??梢詮纳厦嫒魏我粋€事件過程調(diào)用這個過程。以下是一個示例:
'這個例程在公共過程中。
Public Sub FileNew ()
Dim frmNewPad As New frmNotePad
frmNewPad.Show
End Sub
'在子窗體的“文件”菜單上選取“新建”。
Private Sub mnuchildFileNew_Click ()
FileNew
End Sub
'在 MDI 窗體的“文件”菜單上選取“新建”。
Private Sub mnumdiFileNew_Click ()
frmNotePad.FileNew
End Sub
'在工具欄上單擊“新建文件”按鈕。
Private Sub btnFileNew_Click ()
frmNotePad.FileNew
End Sub
協(xié)調(diào)菜單與工具欄的外觀
當(dāng)由其它應(yīng)用程序提供的對象在窗體中被激活時,有許多方法讓對象的菜單與工具欄出現(xiàn)在容器窗體內(nèi);然而,需要規(guī)定它們將如何顯示。這一過程叫做用戶界面協(xié)調(diào),因為 Visual Basic 與已經(jīng)鏈接或嵌入的對象必須協(xié)調(diào)容器窗體中的空間。
控制菜單的外觀
通過設(shè)置窗體的 NegotiateMenus 屬性可以決定一個鏈接或嵌入的對象的菜單是否出現(xiàn)在容器窗體中。如果子窗體的 NegotiateMenus 屬性置為 True(缺省),而且容器有一個定義的菜單欄,那么,當(dāng)這個對象被激活時,它的菜單就放置在容器的菜單欄中。如果容器沒有菜單欄,或者NegotiateMenus 屬性被設(shè)置為 False,那么,當(dāng)這個對象激活時對象的菜單將不出現(xiàn)。
注意 NegotiateMenus 屬性不適用于 MDI 窗體。
控制工具欄的外觀
MDI 窗體的 NegotiateToolbars 屬性決定了鏈接或嵌入對象的工具欄是不固定的調(diào)色板還是被放置在父窗體上。這種性能不要求工具欄出現(xiàn)在 MDI 父窗體上。如果 MDI 窗體的 NegotiateToolbars 屬性設(shè)為 True,則對象的工具欄出現(xiàn)在 MDI 父窗體上。如果 NegotiateToolbars 設(shè)為 False,則對象的工具欄就為不固定的調(diào)色板。
注意 NegotiateToolbars 屬性只用于 MDI 窗體。
如果 MDI 窗體包含工具欄,它通常被包含在父窗體的 PictureBox 控件中。圖片框的 Negotiate 屬性決定了被激活時容器的工具欄是繼續(xù)顯示還是被對象的工具欄所代替。如果 Negotiate 設(shè)置為 True,則除了容器的工具欄外還顯示對象的工具欄。如果 Negotiate 設(shè)置為 False,則對象的工具欄代替容器的工具欄。
注意 菜單與工具欄的協(xié)調(diào)只發(fā)生在支持現(xiàn)場激活的可插入對象之上。有關(guān)現(xiàn)場激活的詳細(xì)信息,請參閱第十章“用部件編程”。用以下過程可以看到這三個屬性如何交互作用。
要執(zhí)行菜單與工具欄的協(xié)調(diào),請按照以下步驟執(zhí)行:
1. 在 MDI 窗體中添加工具欄。這在本章前面的“創(chuàng)建工具欄”中描述過。
2. 在子窗體上放置一個可插入的對象。
3. 設(shè)置 NegotiateMenus、NegotiateToolbars 以及 Negotiate 屬性。
4. 運(yùn)行此應(yīng)用程序,然后雙擊該對象。
對話框
在基于 Windows 的應(yīng)用程序中,對話框被用來:
提示用戶提供應(yīng)用程序繼續(xù)執(zhí)行所需要的數(shù)據(jù)。
向用戶顯示信息。
例如,在 Visual Basic 中,用“打開文件”對話框來顯示已存在的工程。VisualBasic 中的“關(guān)于”對話框也是一個如何使用對話框來顯示信息的例子。在菜單欄上單擊“幫助”,選擇“關(guān)于 Visual Basic”菜單項,則顯示“關(guān)于”對話框。
模式與無模式的對話框
對話框不是模式就是無模式的。模式對話框,在可以繼續(xù)操作應(yīng)用程序的其他部分之前,必須被關(guān)閉(隱藏或卸載)。例如,如果一個對話框,在可以切換到其它窗體或?qū)υ捒蛑耙笙葐螕簟按_定”或“取消”,則它就是模式的。
Visual Basic 中的“關(guān)于”對話框是模式的。顯示重要消息的對話框總應(yīng)當(dāng)是模式的——那就是說,在繼續(xù)做下去之前,總是要求用戶應(yīng)當(dāng)先關(guān)上對話框或者對它的消息作出響應(yīng)。
無模式的對話框允許在對話框與其他窗體之間轉(zhuǎn)移焦點而不用關(guān)閉對話框。當(dāng)對話框正在顯示時,可以在當(dāng)前應(yīng)用程序的其他地方繼續(xù)工作。無模式對話框很少使用。Visual Basic 中“編輯”菜單中的“查找”對話框就是一個無模式對話框的實例。無模式對話框用于顯示頻繁使用的命令與信息。
要將窗體作為模式對話框顯示,請
1.使用 Show 方法,其 style 參數(shù)值為 vbModal(一個值為 1 的常數(shù))。例如:
'將 frmAbout 作為模式對話框顯示。
frmAbout.Show vbModal
要將窗體作為無模式對話框顯示,請
2.使用不帶 style 參數(shù)的 Show方法。
例如:
'將 frmAbout 作為無模式對話框顯示。
frmAbout.Show
注意 如果窗體顯示為模式對話框,則只有當(dāng)對話框關(guān)閉之后,在 Show 方法后的代碼才能執(zhí)行。然而,當(dāng)窗體被顯示為無模式對話框時,在該窗體顯示出來以后,Show 方法后面的代碼緊接著就會執(zhí)行。
Show 方法另有一個可選參數(shù),owner,可用來指定窗體的父子關(guān)系??蓪⒛硞€窗體名傳給這個參數(shù),使得這個窗體成為新窗體的擁有者。要顯示一個窗體,作為另一個窗體的子窗體,請
這里 Show 方法有兩個參數(shù):style 和 owner。
例如:
' 將 frmAbout 顯示為 frmMain 的無模式子窗體。
frmAbout.Show vbModeless, frmMain
在 Show 方法中使用 owner 參數(shù),確保對話框在它的父窗體最小化時它也最小化,或者在其父窗體關(guān)閉時它也卸載。
預(yù)定義對話框的使用
在應(yīng)用程序中添加對話框最容易的方法是使用預(yù)定義對話框,因為不必考慮設(shè)計、裝載或者顯示對話框方面的問題。然而,控件在其外觀上要受到限制。預(yù)定義的對話框總是模式的。
下表列出了 Visual Basic 應(yīng)用程序中添加預(yù)定義對話框時能使用的函數(shù)。
用輸入框來提示輸入
應(yīng)用 InputBox 函數(shù)請求提供數(shù)據(jù)。這個函數(shù)顯示要求輸入數(shù)據(jù)的模式對話框。圖 6.17 所示的文本輸入框提示輸入要打開文件的名稱。
以下代碼顯示圖 6.17 中所示的輸入框。
FileName = InputBox("Enter file to open:", "File Open")
注意 切記當(dāng)使用 InputBox 函數(shù)時,對對話框的各部分的控制非常有限。只能改變標(biāo)題欄中的文本、顯示給用戶的命令提示、對話框在屏幕上的位置以及它是否顯示一個“幫助”按鈕。
詳細(xì)信息 請參閱《語言參考》的“InputBox 函數(shù)”。
用消息對話框顯示信息
可以用 MsgBox 函數(shù)獲得“是”或者“否”的響應(yīng),并顯示簡短的消息,比如:錯誤、警告或者對話框中的期待。看完這些消息以后,可選取一個按鈕來關(guān)閉該對話框。
如果文件不能打開,那么名為 Text Editor 的應(yīng)用程序就會顯示如圖 6.18 所示的消息對話框。
以下代碼顯示如圖 6.18 所示的消息框:
MsgBox "Error encountered while trying to open file, _
please retry.", vbExclamation, "Text Editor"
注意 所謂模式的,既可以局限于應(yīng)用程序中,也可以局限于系統(tǒng)中。如果消息框的模式局限在應(yīng)用程序中(缺?。瑒t在這個對話框未消失之前不能切換到該應(yīng)用程序的其他部分,但是可以切換到其他應(yīng)用程序。在消息框未消失之前系統(tǒng)的模式消息框不允許切換到別的應(yīng)用程序。
詳細(xì)信息 請參閱《語言參考》的“MsgBox 函數(shù)”。
用窗體作為自定義對話框
自定義對話框就是用戶所創(chuàng)建的含有控件的窗體——這些控件包括命令按鈕、選取按鈕和文本框——它們可以為應(yīng)用程序接收信息。通過設(shè)置屬性值來自定義窗體的外觀。也可以編寫在運(yùn)行時顯示對話框的代碼。
要創(chuàng)建自定義對話框,可以從新窗體著手,或者自定義現(xiàn)成的對話框。如果重復(fù)過多,可以建造能在許多應(yīng)用程序中使用的對話框的集合。
要自定義現(xiàn)存的對話框,請按照以下步驟執(zhí)行:
1. 從“工程”菜單中選取“添加窗體”,在工程中添加一現(xiàn)存的窗體。
2. 從“文件”菜單中選取“filename 另存為”并輸入新的文件名(這可以防止改變已存在的窗體版本)。
3. 根據(jù)需要自定義窗體的外觀。
4. 在代碼窗口中自定義事件過程。
要創(chuàng)建新的對話框,請按照以下步驟執(zhí)行:
1. 從“工程”菜單中選取“添加窗體”。
- 或者 -
在工具欄上單擊“窗體”按鈕,創(chuàng)建新的窗體。
2. 如有必要,自定義窗體外觀。
3. 在“代碼”窗口中自定義事件過程。
有很大的自由來定義自定義對話框的外觀。它可以是固定的或可移動的、模式或無模式的。它可以包含不同類型的控件;然而,對話框通常不包括菜單欄、窗口滾動條、最小化與化按鈕、狀態(tài)條或者尺寸可變的邊框。本主題余下的部分將討論創(chuàng)建典型類型的對話框方法。
添加標(biāo)題
對話框總應(yīng)當(dāng)有標(biāo)識它的標(biāo)題。要創(chuàng)建標(biāo)題,設(shè)置該窗體的 Caption 屬性為將在標(biāo)題條中顯示的文本字符串。通常,這一步是在設(shè)計時使用“屬性”窗口來完成的,但也可以用代碼來完成這一步。例如:
frmAbout.Caption = "About"
提示 如果想完全刪除此標(biāo)題欄,可以設(shè)置窗體的 ControlBox、MinButton 和MaxButton 為 False;設(shè)置 BorderStyle 為尺寸不可變的設(shè)置(0、1 或 3),并設(shè)置 Caption 為空字符串 ("")。
設(shè)置標(biāo)準(zhǔn)對話框的屬性
一般來說,用戶響應(yīng)對話框時,先提供信息,然后用“確定”或者“取消”命令按鈕關(guān)閉對話框。因為對話框是臨時性的,用戶通常不需要對它進(jìn)行移動、改變尺寸、化或最小化等操作。其結(jié)果是:隨新窗體出現(xiàn)的可變尺寸邊框類型、“控制”菜單框、“化”按鈕以及“最小化”按鈕,在大多數(shù)對話框中都是不需要的。
通過設(shè)置 BorderStyle、ControlBox、MaxButton 和 MinButton 屬性,可以刪除這些項目。例如,“關(guān)于”對話框可能使用以下的屬性設(shè)置。
記住,如果刪除“控制”菜單框 ( ControlBox = False ),則必須向用戶提供退出該對話框的其它方法。實現(xiàn)的辦法通常是在對話框中添加“確定”、“取消”或者“退出”命令按鈕,并在隱藏或卸載該對話框的 Click 按鈕事件中添加代碼。
添加和放置命令按鈕
模式對話框必須至少包含一個退出該對話框的命令按鈕。通常用兩個命令按鈕:其中一個按鈕開始動作,而另一個按鈕關(guān)閉該對話框而不做任何改變。典型狀態(tài)是,這兩個按鈕的 Caption 屬性設(shè)置“確定”與“取消”。在這個方案中,“確定”命令按鈕的 Default 屬性設(shè)置為 True,而 Cancel 命令按鈕的 Cancel 屬性設(shè)置為 True。雖然“確定”與“取消”是最常用的按鈕,其他的按鈕標(biāo)題組合也可使用。
顯示消息的對話框通常使用 Label 控件來顯示錯誤消息或者命令提示,并且用一至兩個命令按鈕來執(zhí)行動作。例如,也許給標(biāo)識的 Caption 屬性賦以錯誤消息或者命令提示,而給兩個命令按鈕控件的 Caption 屬性指定“是”與“否”。當(dāng)用戶選取“是”,則發(fā)生一個動作,當(dāng)選取“否”時,則發(fā)生另一個動作。
這種類型對話框的命令按鈕通常被放置在對話框的底部或右邊,而頂部或左邊的按鈕為缺省按鈕,如圖 6.19 所示。
設(shè)置缺省、取消和焦點
命令按鈕控件提供了以下的屬性:
Default
Cancel
TabIndex
TabStopDefault
按鈕就是當(dāng)用戶按下 ENTER 鍵時選中的按鈕。在一個窗體上,只能有一個命令按鈕的 Default 屬性可以設(shè)置為 True。按下 ENTER 鍵就調(diào)用缺省命令按鈕的 Click 事件。這個功能連同編輯控件(比如 TextBox )一起工作。例如,可以在文本框中鍵入數(shù)據(jù),然后按下 ENTER 鍵來產(chǎn)生Click 事件,以取代選取“確定”按鈕。
“取消”按鈕就是當(dāng)按下 ESC 鍵時選中的按鈕。在一個窗體上,只能有一個命令按鈕的 Cancel 屬性可以設(shè)置為 True。按下 ESC 鍵調(diào)用“取消”命令按鈕的 Click 事件。“取消”按鈕也可以為缺省命令按鈕。要指定對話框的“取消”按鈕,設(shè)置該命令按鈕的 Cancel 屬性為 True。
提示 一般說來,代表最可靠的或者最安全的操作的按鈕應(yīng)當(dāng)是缺省按鈕。例如,在“文本替換”對話框中,“取消”應(yīng)當(dāng)是缺省按鈕,而不是“全部替換”。
也可以指定當(dāng)對話被顯示時具有焦點的按鈕。當(dāng)窗體被顯示時,帶有最低的 TabIndex 設(shè)置的控件接收焦點。按下 ENTER 鍵會調(diào)用缺省命令按鈕或者有焦點的命令按鈕的 Click 事件。要在窗體被顯示時將焦點給某個命令按鈕,則設(shè)置該命令按鈕的 TabIndex 為 0,它的 TabStop 屬性為 True。也可以用 SetFocus 方法在窗體被顯示時將焦點給指定的控件。
詳細(xì)信息 請參閱《語言參考》的“TabIndex 屬性”與“TabStop 屬性”。
使對話框上的控件無效
有時候需要使控件無效,因為它們的動作在當(dāng)前的上下文中不適用。例如,當(dāng) Visual Basic 的“查找”對話框第一次顯示時,“查找下一個”按鈕應(yīng)無效,如圖 6.20 所示。設(shè)置對話上的控件的 Enabled 屬性為 False,可以使其無效。
要使對話框上的控件無效,請
1.設(shè)置每個控件的 Enabled 屬性為 False。例如:
cmdFindNext.Enabled = False
cmdReplace.Enabled = False
顯示自定義對話框
使用應(yīng)用程序中顯示其他窗體同樣的方法來顯示對話框。當(dāng)應(yīng)用程序運(yùn)行時,啟動窗體會自動裝入。想在應(yīng)用程序中出現(xiàn)第二個窗體或?qū)υ捒?,要用裝入并顯示它的代碼來實現(xiàn)。同樣,想要窗體或?qū)υ捒蛳В惨帉懶遁d或隱藏它的代碼。
以下代碼在用戶選取“幫助”菜單中的“關(guān)于”菜單項時顯示“關(guān)于”對話框。
Private Sub mnuHelpAbout_Click ()
'此處用 style = vbModal 的 Show 方法將對話框顯示為模式的。
frmAbout.Show vbModal
End Sub