VisualBasic工具欄、對(duì)話框

字號(hào):

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