版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第12章
多重窗體與MDI窗體程序設(shè)計(jì)多重窗體與MDI窗體概述多重窗體程序設(shè)計(jì)MDI窗體程序設(shè)計(jì)12.1多重窗體與MDI窗體概述多重窗體是指一個(gè)應(yīng)用程序中有多個(gè)并列的普通窗體,每個(gè)窗體都是一個(gè)對(duì)象,可以有屬于自己的對(duì)象、屬性和事件過(guò)程,完成不同的功能。MDI窗體是指一個(gè)應(yīng)用程序(父窗體)中包含多個(gè)文檔(子窗體),絕大多數(shù)基于Windows的大型應(yīng)用程序都是MDI窗體,如MicrosoftExcel和MicrosoftWord等應(yīng)用程序都是MDI窗體程序。MDI窗體可以同時(shí)打開(kāi)多個(gè)文檔,它簡(jiǎn)化了文檔之間的信息交換。在多重窗體中,窗體分為模態(tài)(Modal)和非模態(tài)(Nonmodal)兩種類型。在屏幕上顯示后用戶必須響應(yīng)的窗體叫模態(tài)(Modal)窗體,除非用戶單擊OK(確定)或Cancel(取消)按鈕、或者關(guān)閉這個(gè)窗體,否則這種窗體將一直得到輸入焦點(diǎn)。用戶可以隨意在其間切換的窗體叫非模態(tài)(Nonmodal)窗體或無(wú)模式窗體。為了方便用戶使用,大多數(shù)Windows下的應(yīng)用程序在顯示信息時(shí),都使用非模態(tài)窗體。因此,在VisualBasic中建立新窗體時(shí),非模態(tài)窗體是缺省設(shè)置。窗體的很多屬性都可以獨(dú)立設(shè)置,其中包括窗體的標(biāo)題、大小、邊框類型、前景顏色、背景顏色、顯示字庫(kù)和背景畫(huà)面等。MDI窗體允許創(chuàng)建在單個(gè)容器窗體中包含多個(gè)窗體的應(yīng)用程序,允許用戶同時(shí)顯示多個(gè)文檔,每個(gè)文檔顯示在它自己的窗體中。MDI窗體是有父子關(guān)系的窗體,可以根據(jù)窗體作用的不同,來(lái)確定窗體是父窗體還是子窗體。文檔或子窗體被包含在父窗體中,父窗體為應(yīng)用程序中所有的子窗體提供工作空間,用戶在父窗體完成幾乎所有的工作。例如:MicrosoftExcel允許創(chuàng)建并顯示不同樣式的多文檔窗體,每個(gè)子窗體都被限制在Excel父窗體的區(qū)域之內(nèi)。當(dāng)最小化Excel父窗體時(shí),所有的文檔窗體都被最小化,只有父窗體的圖標(biāo)顯示在任務(wù)欄中。當(dāng)關(guān)閉Excel父窗體時(shí),所有的文檔窗體都被關(guān)閉,但關(guān)閉某個(gè)文檔窗口時(shí),Excel父窗體不會(huì)被關(guān)閉。具體什么時(shí)候選用單窗體程序,什么時(shí)候使用多重窗體或MDI窗體呢?這需要根據(jù)應(yīng)用程序的目的,來(lái)決定使用哪種界面樣式最好。例如:日歷程序最好設(shè)成單窗體程序,因?yàn)闆](méi)有必要同時(shí)打開(kāi)一個(gè)以上日歷;一個(gè)處理保險(xiǎn)索賠的應(yīng)用程序可能要設(shè)計(jì)成MDI窗體,使用多文檔界面樣式,因?yàn)橐粋€(gè)職員很可能會(huì)同時(shí)處理一個(gè)以上索賠,或者需要對(duì)兩個(gè)索賠進(jìn)行比較;而一個(gè)管理信息系統(tǒng)(MIS系統(tǒng)),需要完成的功能比較多,比如最基本的功能添加、修改、刪除和查詢記錄等,這些功能的實(shí)現(xiàn)都需要窗體界面,而這些窗體一般都是并列使用,所以像學(xué)生成績(jī)管理系統(tǒng)這樣的應(yīng)用程序一般設(shè)計(jì)成多重窗體程序。12.2多重窗體程序設(shè)計(jì)在多重窗體程序中,要建立的界面由多個(gè)窗體組成,每個(gè)窗體的界面的設(shè)計(jì)與前面學(xué)過(guò)的完全一樣。程序代碼也是針對(duì)每個(gè)窗體編寫(xiě)的,因此也與單一窗體程序設(shè)計(jì)中的代碼編寫(xiě)類似,只要注意各個(gè)窗體之間的相互關(guān)系就可以了。多重窗體實(shí)際上是單一窗體的集合,而單一窗體是多重窗體程序設(shè)計(jì)的基礎(chǔ)。掌握了單一窗體程序的設(shè)計(jì),多重窗體的程序設(shè)計(jì)是很容易的。12.2.1添加窗體如果想在現(xiàn)有的工程中添加一個(gè)窗體,需要使用“添加窗體”對(duì)話框,如右圖所示,可以用三種方法打開(kāi)“添加窗體”對(duì)話框:“新建”選項(xiàng)卡(1)通過(guò)“工程”(Project)菜單中的“添加窗體”(AddForm)命令。(2)單擊工具欄上的“添加窗體”按鈕。(3)在“工程資源管理器”窗口內(nèi)單擊右鍵,在彈出菜單中選擇“添加”,再在下一級(jí)子菜單中選擇“添加窗體”。在“添加窗體”對(duì)話框里,可以選擇“新建”選項(xiàng)卡新建一個(gè)窗體,也可以選擇“現(xiàn)存”選項(xiàng)卡把一個(gè)屬于其他工程的窗體添加到當(dāng)前工程中,這是因?yàn)槊總€(gè)窗體都是以獨(dú)立的文件保存的(擴(kuò)展名為frm)。當(dāng)新建一個(gè)窗體時(shí),可以選擇欲建立窗體的類型(VisualBasic的不同版本預(yù)定義窗體集也不一樣),默認(rèn)是建立一個(gè)新的空白窗體,你可以選擇建立為特定任務(wù)設(shè)計(jì)的半成品窗體。程序中第一個(gè)窗體被默認(rèn)命名為Form1,后續(xù)的窗體則分別命名為Form2、Form3等,為了便于在代碼中引用窗體,最好是根據(jù)窗體的功能進(jìn)行重新命名。當(dāng)添加一個(gè)已經(jīng)存在的窗體到當(dāng)前工程時(shí),有兩個(gè)問(wèn)題需要注意:(1)該工程內(nèi)的每個(gè)窗體的Name屬性不能相同,否則不能將現(xiàn)存的窗體添加進(jìn)來(lái)。(2)在該工程內(nèi)添加進(jìn)來(lái)的現(xiàn)存窗體實(shí)際上在多個(gè)工程中共享,因此,對(duì)該窗體所做的改變,會(huì)影響到共享該窗體的所有工程。12.2.2設(shè)置啟動(dòng)對(duì)象在單一窗體程序中,程序的執(zhí)行沒(méi)有其他選擇,即只能從這個(gè)窗體開(kāi)始執(zhí)行。多重窗體程序由多個(gè)窗體構(gòu)成,而且多個(gè)窗體多是并列關(guān)系,VisualBasic怎么知道是從哪個(gè)窗體開(kāi)始執(zhí)行呢?程序運(yùn)行過(guò)程中,首先執(zhí)行的對(duì)象被稱為啟動(dòng)對(duì)象。VisualBasic規(guī)定,對(duì)于多重窗體程序,必須指定其中一個(gè)對(duì)象為啟動(dòng)對(duì)象。缺省情況下,第一個(gè)創(chuàng)建的窗體被默認(rèn)指定為啟動(dòng)對(duì)象,即啟動(dòng)窗體。啟動(dòng)對(duì)象既可以是窗體,也可以是Main子過(guò)程。如果啟動(dòng)對(duì)象是Main子過(guò)程,則程序啟動(dòng)時(shí)不加載任何窗體,以后由該過(guò)程根據(jù)不同的情況決定是否加載或加載哪一個(gè)窗體。需要注意的是,Main子過(guò)程必須放在標(biāo)準(zhǔn)模塊中,絕對(duì)不能放在窗體模塊內(nèi)??梢酝ㄟ^(guò)“工程”菜單中“工程屬性”命令來(lái)指定啟動(dòng)對(duì)象。執(zhí)行該命令后,將打開(kāi)“工程屬性”對(duì)話框,然后選擇該對(duì)話框中的“通用”選項(xiàng)卡,將顯示的對(duì)話框如圖右所示?!巴ㄓ谩边x項(xiàng)卡在前圖所示的對(duì)話框中,單擊“啟動(dòng)對(duì)象”欄右端的箭頭,將下拉顯示當(dāng)前工程中所有窗體的列表,如下圖所示。此時(shí)條形光標(biāo)位于當(dāng)前啟動(dòng)對(duì)象上,如果需要改變,則單擊作為啟動(dòng)對(duì)象的名字,然后單擊“確定”按鈕,即可把所選擇的窗體設(shè)置為啟動(dòng)對(duì)象。指定啟動(dòng)對(duì)象12.2.3與多重窗體程序設(shè)計(jì)有關(guān)的語(yǔ)句和方法在單窗體程序設(shè)計(jì)中,所有的操作都在一個(gè)窗體中完成,不需要在多個(gè)窗體間切換。而在多窗體程序中,需要打開(kāi)、關(guān)閉、隱藏或顯示指定的窗體,這可以通過(guò)相應(yīng)的語(yǔ)句和方法來(lái)實(shí)現(xiàn)。下面介紹與多重窗體程序設(shè)計(jì)有關(guān)的語(yǔ)句和方法。1.Load語(yǔ)句該語(yǔ)句把一個(gè)在編程環(huán)境中已經(jīng)建立的窗體裝入內(nèi)存。當(dāng)VisualBasic執(zhí)行了該語(yǔ)句后,窗體并沒(méi)有顯示出來(lái),只是被調(diào)入內(nèi)存,但你可以在程序中的任一事件過(guò)程中訪問(wèn)它,而且使用它所定義的任何屬性和方法。用Load語(yǔ)句裝入新窗體的語(yǔ)法格式為:例如,語(yǔ)句:LoadForm2,則工程中名稱為Form2的窗體就會(huì)被調(diào)入內(nèi)存。如果想把該窗體的Caption屬性設(shè)置為“系統(tǒng)主界面”,可在任何事件過(guò)程中鍵入下述語(yǔ)句:Form2.Caption="系統(tǒng)主界面"。在首次使用Load語(yǔ)句將窗體調(diào)入內(nèi)存時(shí)依次觸發(fā)窗體的Initialize和Load事件。Load窗體名稱2.Unload語(yǔ)句該語(yǔ)句與Load語(yǔ)句的功能相反,它從內(nèi)存中刪除指定的窗體。該語(yǔ)句的語(yǔ)法格式為:Unload窗體名稱Unload的一種常見(jiàn)用法是UnloadMe,其意義是關(guān)閉窗體自己。在這里,關(guān)鍵字Me代表UnloadMe語(yǔ)句所在的窗體。3.Show方法該方法用來(lái)顯示一個(gè)窗體,它兼有加載和顯示窗體兩種功能。也就是說(shuō),使用Show方法時(shí),如果窗體不在內(nèi)存中(即以前沒(méi)有執(zhí)行Load語(yǔ)句),則Show方法自動(dòng)把窗體裝入內(nèi)存,然后再顯示出來(lái)。Show方法的語(yǔ)法格式為:[窗體名稱.]Show[模式]如果省略了“窗體名稱”,則顯示當(dāng)前窗體。參數(shù)“模式”用來(lái)確定窗體是以模態(tài)加載還是非模態(tài)加載,它可以取0和1兩個(gè)值(注意不是False和True)。當(dāng)“模式”值為1(或常量vbModal)時(shí),表示窗體是“模態(tài)型”窗體。在這種情況下,鼠標(biāo)只在此窗體內(nèi)起作用,不能到其他窗口內(nèi)操作,只有在關(guān)閉該窗口后才能對(duì)其他窗口進(jìn)行操作。例如,MicrosoftWord中“幫助”菜單的“關(guān)于”命令所打開(kāi)的對(duì)話框窗口就是這種窗口。當(dāng)“模式”值為0(或省略該參數(shù))時(shí),表示窗體為“非模態(tài)型”窗口,不用關(guān)閉該窗體就可以對(duì)其他窗口進(jìn)行操作。例如,要以非模態(tài)窗體形式顯示Form2,可使用如下語(yǔ)句:Form2.Show。VisualBasic提供獨(dú)立的Load語(yǔ)句使程序能夠預(yù)先將窗體裝入內(nèi)存,這樣,Show方法執(zhí)行得會(huì)非???,用戶往往感覺(jué)不到任何延遲。建議你最好預(yù)先裝入窗體,特別是當(dāng)窗體包含很多對(duì)象或藝術(shù)修飾時(shí),這樣做尤其必要。4.Hide方法該方法用來(lái)將窗體暫時(shí)隱藏起來(lái),但并沒(méi)有從內(nèi)存中刪除,因此它與Unload語(yǔ)句的作用是不一樣的。其語(yǔ)法格式為:當(dāng)省略窗體名稱時(shí),默認(rèn)隱藏當(dāng)前窗體。Hide方法和Unload語(yǔ)句的區(qū)別:使用Hide方法把窗體隱藏后,窗體雖然看不見(jiàn)了,但它仍駐留在內(nèi)存中,可以供程序使用。隱藏窗體和通過(guò)設(shè)置窗體的Visible屬性使窗體不可見(jiàn)的效果是相同的。使用Unload語(yǔ)句卸載窗體,是把窗體從內(nèi)存中清除,卸載窗體釋放了用來(lái)存儲(chǔ)窗體對(duì)象和圖形的內(nèi)存空間,但并不釋放窗體事件過(guò)程占用的空間,這些事件過(guò)程常駐內(nèi)存。窗體被卸載后,其運(yùn)行時(shí)的值和屬性也就丟失了。當(dāng)再裝入該窗體時(shí),這些值恢復(fù)為程序代碼中設(shè)定的初始值。[窗體名稱.]Hide12.2.4不同窗體間數(shù)據(jù)的存取不同窗體數(shù)據(jù)的存取分為兩種情況:(1)存取控件中的屬性在當(dāng)前窗體中要存取另一個(gè)窗體中某個(gè)控件的屬性,表示如下:另一個(gè)窗體名稱.控件名.屬性例如,設(shè)置當(dāng)前窗體(Form1)中的文本框(Text1)的值,使它等于另一個(gè)窗體(Form2)中的兩個(gè)文本框(Text1和Text2)的數(shù)值之和,實(shí)現(xiàn)的語(yǔ)句如下:(2)存取變量的值根據(jù)變量的定義位置和所使用的變量定義語(yǔ)句的不同,VisualBasic中的變量可以分為3類,即局部變量、模塊變量及全局變量,其中模塊變量包括窗體模塊變量和標(biāo)準(zhǔn)模塊變量。各種變量位于不同的層次。Text1.Text=Val(Form2.Text1.Text)+Val(Form2.Text2.Text)在過(guò)程(事件過(guò)程或通用過(guò)程)內(nèi)定義的變量叫做局部變量,其作用域是它所在的過(guò)程。某一過(guò)程的執(zhí)行只對(duì)該過(guò)程內(nèi)的變量產(chǎn)生作用,對(duì)其他過(guò)程中相同名字的局部變量沒(méi)有任何影響。因此,可以在不同的過(guò)程中定義相同名字的局部變量,它們之間沒(méi)有任何關(guān)系。對(duì)于局部變量,可以使用Dim或Static語(yǔ)句聲明,也可以在需要時(shí)直接給出變量名。變量的類型可以使用類型說(shuō)明符標(biāo)識(shí)。如果沒(méi)有類型說(shuō)明符,VisualBasic把該變量指定為變體數(shù)據(jù)類型。窗體變量可用于該窗體內(nèi)的所有過(guò)程。一個(gè)窗體可以包含若干個(gè)過(guò)程,當(dāng)同一窗體內(nèi)的不同過(guò)程使用相同的變量時(shí),則可以使用窗體變量。在使用窗體變量前,必須先聲明,也就是說(shuō)窗體變量不能默認(rèn)聲明。其方法是在程序代碼窗口的“對(duì)象”框中選擇“通用”,并在“過(guò)程”框中選擇“聲明”。聲明的時(shí)候,可以使用Dim、Private或Public語(yǔ)句。標(biāo)準(zhǔn)模塊變量與窗體變量是類似,這里不在敘述。全局變量的作用域最大,可以在工程的每個(gè)模塊、每個(gè)過(guò)程使用。和模塊級(jí)變量類似,全局變量也在“通用”部分聲明。所不同的是,全局變量必須用Public或Global語(yǔ)句聲明,不能用Dim語(yǔ)句聲明,更不能用Private語(yǔ)句聲明。同時(shí),全局變量只能在標(biāo)準(zhǔn)模塊中聲明,不能在過(guò)程或窗體模塊中聲明。在應(yīng)用程序中任何地方都可以修改全局變量,因此使用全局變量要格外小心,特別是在沒(méi)有強(qiáng)制要求定義變量的情況下。我們?cè)诙鄠€(gè)窗體之間存取變量時(shí),變量必須是窗體級(jí)變量,先用Public語(yǔ)句聲明,其引用格式如下:例如,工程中有兩個(gè)窗體(Form1和Form2),在Form1的“通用”里這樣聲明一個(gè)變量:PublictestAsString,則在Form2中就可以這樣引用Form1中的變量:a=Form1.test為了方便起見(jiàn),要在多個(gè)窗體中存取的變量一般放在一個(gè)標(biāo)準(zhǔn)模塊內(nèi),用Public語(yǔ)句或Global語(yǔ)句聲明成全局變量。窗體名稱.變量名12.2.5多重窗體程序設(shè)計(jì)舉例例12.1
輸入學(xué)生五門(mén)課程的成績(jī),計(jì)算總分及平均分并顯示。本例有三個(gè)窗體,名稱分別為frmMain、frmInput和frmOutput,其中frmMain作為本程序的主窗體,frmInput和frmOutput分別作為本程序的輸入和輸出窗體。另外,還要添加一個(gè)標(biāo)準(zhǔn)模塊Module1,在這個(gè)標(biāo)準(zhǔn)模塊內(nèi)聲明多窗體間共用的全局變量。工程資源管理器窗口如下圖所示。工程資源管理器窗口frmMain窗體如下圖所示,這是本程序的主窗體,運(yùn)行后看到的第一個(gè)窗體。該窗體上有三個(gè)命令按鈕,標(biāo)題分別為:“輸入成績(jī)”、“計(jì)算成績(jī)”和“結(jié)束程序”;名稱分別為:cmdInput、cmdOutput和cmdExit,其中“輸入成績(jī)”和“計(jì)算成績(jī)”按鈕分別用來(lái)顯示frmInput和frmOutput窗體。frmMain窗體frmInput窗體如左圖所示,這是當(dāng)在主窗體上單擊了“輸入成績(jī)”按鈕后彈出的窗體。該窗體上有五個(gè)用于輸入學(xué)生成績(jī)的文本框,名稱分別為:txtMath、txtChem、txtEng、txtPhy和txtChin。還有一個(gè)命令按鈕,標(biāo)題為“確定”,名稱為:cmdOk。frmOutput窗體如右圖所示,這是當(dāng)在主窗體上單擊了“計(jì)算成績(jī)”按鈕后彈出的窗體。該窗體上有用于顯示學(xué)生平均成績(jī)和總分的標(biāo)簽,名稱為:labelAverage和LabelTotal。還有一個(gè)命令按鈕,標(biāo)題為“返回”,名稱為“cmdReturn”。
frmInput窗體frmOutput窗體在Module1標(biāo)準(zhǔn)模塊內(nèi),聲明了在多個(gè)窗體間共用的全局變量,即:PublicsMathAsSinglePublicsChemAsSinglePublicsEngAsSinglePublicsPhyAsSinglePublicsChinAsSingle主窗體frmMain的事件過(guò)程如下:PrivateSubcmdInput_Click()Me.HidefrmInput.ShowEndSubPrivateSubcmdOutput_Click()Me.HidefrmOutput.ShowEndSubPrivateSubcmdExit_Click()EndEndSub輸入成績(jī)窗體frmInput的事件過(guò)程為:PrivateSubcmdOk_Click()sMath=Val(txtMath.Text)sChem=Val(txtChem.Text)sEng=Val(txtEng.Text)sPhy=Val(txtPhy.Text)sChin=Val(txtChin.Text)Me.HidefrmMain.ShowEndSub計(jì)算成績(jī)窗體frmOutput的事件過(guò)程如下:PrivateSubForm_Load()DimsTotalAsSinglesTotal=sMath+sChem+sEng+sPhy+sChinlabelAverage.Caption=sTotal/5LabelTotal.Caption=sTotalEndSubPrivateSubcmdReturn_Click()Me.HidefrmMain.ShowEndSub對(duì)于不同窗體間數(shù)據(jù)的存取,我們?cè)谇懊嬉呀榻B了兩種方法,大家可以試著用另一種方法來(lái)實(shí)現(xiàn)本程序的功能。例12.2
設(shè)計(jì)一個(gè)模擬登陸系統(tǒng)程序,當(dāng)輸入正確的用戶名和密碼時(shí),顯示程序主窗體,并在主窗體上顯示用戶名。當(dāng)用戶輸入錯(cuò)誤時(shí),提示用戶重新輸入,并且最多可以輸入三次。本例程序需要兩個(gè)窗體(frmLogin和frmMain),一個(gè)標(biāo)準(zhǔn)模塊(Module1)。frmLogin窗體就是一個(gè)自定義對(duì)話框,如下圖所示。窗體上有兩個(gè)文本框分別用來(lái)接收用戶輸入的用戶名和密碼,它們的名稱為txtName和txtPwd,其中txtPwd的PasswordChar屬性設(shè)置為“*”。窗體上還有兩個(gè)命令按鈕,標(biāo)題為“確定”和“取消”,名稱為“cmdOK”和“cmdCancel”。為了不讓用戶隨意改變窗體的大小,再把窗體的BorderStyle屬性設(shè)置為3。frmLogin窗體frmMain窗體比較簡(jiǎn)單,用一個(gè)標(biāo)簽(LabelName)顯示當(dāng)前用戶的用戶名,一個(gè)命令按鈕(cmdExit)用來(lái)關(guān)閉本窗口,如下圖所示。frmMain窗體在標(biāo)準(zhǔn)模塊(Module1)內(nèi)聲明一個(gè)全局變量,用來(lái)存放用戶輸入的用戶名,如下:PublicuserAsStringfrmLogin窗體內(nèi)的事件過(guò)程如下:DimtryAsIntegerPrivateSubcmdCancel_Click()UnloadMeEndSubPrivateSubcmdOK_Click()IftxtName.Text=""ThenMsgBox"請(qǐng)輸入用戶名!",vbOKOnly+vbExclamation,"錯(cuò)誤"txtName.SetFocusExitSubEndIfIftxtPwd.Text=""ThenMsgBox"請(qǐng)輸入密碼!",vbOKOnly+vbExclamation,"錯(cuò)誤"txtPwd.SetFocusExitSubEndIfIfTrim(txtName.Text)="vb"AndTrim(txtPwd.Text)="love"ThenMsgBox"你是合法用戶,歡迎使用!",vbOKOnly+vbInformation,"歡迎進(jìn)入"user=Trim(txtName.Text)UnloadMefrmMain.ShowElsetry=try+1Iftry>=3ThenUnloadMeExitSubEndIfMsgBox"用戶名或密碼錯(cuò)誤!您還有"&3-try&"次機(jī)會(huì)!",vbOKOnly+vbCritical,"警告"txtName.SetFocustxtName.Text=""txtPwd.Text=""EndIfEndSubfrmMain窗體內(nèi)的事件過(guò)程比較簡(jiǎn)單,如下所示:PrivateSubForm_Load()LabelName.Caption=userEndSubPrivateSubcmdExit_Click()UnloadMeEndSub12.3MDI窗體程序設(shè)計(jì)MDI窗體程序由父窗口和子窗口組成,父窗口又稱MDI窗體,它被作為子窗口的容器。子窗口又稱文檔窗口,它用于顯示各個(gè)文檔,所有的子窗口都具有相同的功能。12.3.1MDI窗體特性在運(yùn)行時(shí),MDI窗體及其所有的子窗體都呈現(xiàn)特定的性質(zhì),如下所述。(1)所有子窗體均顯示在MDI窗體的工作空間內(nèi)。像其他的窗體一樣,用戶能移動(dòng)子窗體和改變子窗體的大小,不過(guò),它們被限制于這一工作空間內(nèi)。(2)最小化一個(gè)子窗體時(shí),它的圖標(biāo)將顯示于MDI窗體上而不是在任務(wù)欄中。最小化MDI窗體時(shí),此MDI窗體及其所有子窗體將由一個(gè)圖標(biāo)來(lái)代表。還原MDI窗體時(shí),MDI窗體及其所有子窗體將按最小化之前的狀態(tài)顯示出來(lái)。(3)最大化一個(gè)子窗體時(shí),它的標(biāo)題會(huì)與MDI窗體的標(biāo)題組合在一起并顯示于MDI窗體的標(biāo)題欄上。(4)通過(guò)設(shè)定AutoShowChildren屬性,子窗體可以在窗體加載時(shí)自動(dòng)顯示(True)或自動(dòng)隱藏(False)。(5)活動(dòng)子窗體的菜單(若有)將顯示在MDI窗體的菜單欄中,而不是顯示在子窗體中。MDI窗體程序在所謂的“以文檔為中心的應(yīng)用”中特別有用,在這種應(yīng)用程序中,通常同時(shí)使用多個(gè)窗口來(lái)顯示或編輯文檔。12.3.2創(chuàng)建MDI應(yīng)用程序前面已經(jīng)學(xué)習(xí)過(guò),可以通過(guò)“添加窗體”對(duì)話框添加窗體,但這不是MDI窗體,只是多個(gè)普通窗體而已。如果創(chuàng)建一個(gè)MDI窗體應(yīng)用程序,可以按以下步驟執(zhí)行:(1)在“工程”菜單中單擊“添加MDI窗體”菜單項(xiàng),可以創(chuàng)建MDI應(yīng)用程序的父窗體。注意,一個(gè)應(yīng)用程序只能有一個(gè)MDI窗體,如果工程已經(jīng)有了一個(gè)MDI窗體,則該“工程”菜單上的“添加MDI窗體”命令就不可使用。MDI應(yīng)用程序的父窗體是子窗體的容器,在該窗體中可以有菜單欄、工具欄、狀態(tài)欄等,但不可以有文本框等控件。(2)如果要?jiǎng)?chuàng)建子窗體,首先在“工程”菜單中單擊“添加窗體”菜單項(xiàng),創(chuàng)建一個(gè)普通的窗體,然后將該窗體的MDIChild屬性設(shè)為T(mén)rue。一個(gè)應(yīng)用程序可以包含許多相似或者不同樣式的MDI子窗體。若要建立多個(gè)子窗體,則重復(fù)上述操作就可以了。不過(guò),創(chuàng)建以文檔為中心的應(yīng)用程序,一般要求在運(yùn)行時(shí)能提供若干子窗體以存取不同的文檔,而在設(shè)計(jì)時(shí)事先創(chuàng)建好若干個(gè)子窗體的方法是不可取的。一般是先創(chuàng)建一個(gè)子窗體作為這個(gè)應(yīng)用程序文檔的模板,然后通過(guò)對(duì)象變量來(lái)實(shí)現(xiàn)。例如,假設(shè)已經(jīng)建立了一個(gè)名稱為“frmMDIChild”的子窗體模板,則使用下面的語(yǔ)句:就會(huì)為“frmMDIChild”建立一個(gè)新的實(shí)例NewDoc,新實(shí)例具有與“frmMDIChild”窗體相同的屬性、控件和代碼。在運(yùn)行時(shí),子窗體顯示在MDI父窗體工作空間之內(nèi)(其區(qū)域在父窗體邊框以內(nèi)及標(biāo)題與菜單欄之下)。在設(shè)計(jì)時(shí),子窗體并未被限制在MDI窗體區(qū)域之內(nèi),可以添加控件、設(shè)置屬性、編寫(xiě)代碼以及設(shè)計(jì)子窗體功能,就像在其他VisualBasic窗體中做的那樣。DimNewDocAsNewfrmMDIChild通過(guò)查看MDIChild屬性或者檢查工程資源管理器,可以確定窗體是否是一個(gè)MDI子窗體。VisualBasic在“工程資源管理器”中為MDI窗體與MDI子窗體顯示了特定的圖標(biāo),如下圖所示?!肮こ藤Y源管理器”中的MDI窗體、MDI子窗體和標(biāo)準(zhǔn)窗體例12.3
設(shè)計(jì)一個(gè)簡(jiǎn)單的多文檔記事本程序,在這個(gè)應(yīng)用程序中,用戶可以打開(kāi)多個(gè)文檔進(jìn)行簡(jiǎn)單編輯。用我們前面介紹的方法,建立MDI窗體應(yīng)用程序的父窗體,在父窗體上設(shè)計(jì)程序中需要的菜單,各菜單項(xiàng)的屬性如下表所示菜單項(xiàng)Name屬性菜單項(xiàng)Name屬性文件mnuFile編輯mnuEdit….新建mnuNew….剪切mnuCut….保存mnuSave….全選mnuSelect….-mnuBar….退出mnuExit菜單屬性列表還要添加一個(gè)通用對(duì)話框控件(CommonDialog1)用來(lái)打開(kāi)“另存為”對(duì)話框。最后把父窗體的Caption屬性設(shè)置為“多文檔記事本”,設(shè)計(jì)完整的父窗體如下圖所示。設(shè)計(jì)完整的父窗體添加MDI窗體程序的子窗體,首先添加一個(gè)普通窗體,然后把它的MDIChild屬性設(shè)置為T(mén)rue,名稱為“frmChild”,Caption屬性為“文檔”。要實(shí)現(xiàn)應(yīng)用程序的編輯功能,需要在子窗體中引入一個(gè)文本框控件(Text1),設(shè)置Text1的MultiLine屬性為T(mén)rue,ScrollBars屬性值為3,即水平和垂直滾動(dòng)條都存在。在程序代碼中,需要建立一個(gè)子程序來(lái)完成新建文檔的功能。則在父窗體的“通用”里新建一個(gè)過(guò)程LoadNewDoc,用來(lái)完成新建文檔的功能,代碼如下所示:PrivateSubLoadNewDoc()StaticDocCountAsLong'定義一個(gè)用于記數(shù)的靜態(tài)變量DimfrmDocAsfrmChild'定義frmDoc作為窗體對(duì)象DocCount=DocCount+1'每調(diào)用一次,記數(shù)加1SetfrmDoc=NewfrmChild'新建一個(gè)文檔窗體frmDoc.Caption="文檔"&DocCountfrmDoc.ShowEndSub在父窗體的“文件”菜單中“新建”菜單項(xiàng)的Click事件過(guò)程中編寫(xiě)如下代碼:關(guān)于父窗體的“文件”菜單中其他菜單項(xiàng)的事件過(guò)程,涉及到后面的文件操作,這里不再介紹,有興趣的同學(xué)可以自己試著編寫(xiě)代碼。下面介紹“編輯”菜單中“剪切”菜單項(xiàng)和“全選”菜單項(xiàng)代碼的編寫(xiě)。在程序運(yùn)行時(shí)建立了子窗體的許多實(shí)例(副本)來(lái)存取多個(gè)文檔時(shí),它們具有相同的屬性和代碼,然后操作特定的窗體和特定的控件、保持各自的狀態(tài)信息,這對(duì)程序員來(lái)說(shuō)是一個(gè)非常重要的問(wèn)題。在VisualBasic中,提供了訪問(wèn)MDI窗體的兩個(gè)屬性:ActiveForm和ActiveControl,前者表示具有焦點(diǎn)的或者最后被激活的子窗體,在程序中用它可以自動(dòng)識(shí)別當(dāng)前活動(dòng)窗體,后者表示活動(dòng)子窗體上具有焦點(diǎn)的控件。PrivateSubmnuNew_Click()LoadNewDocEndSub“剪切”菜單項(xiàng)的Click事件過(guò)程中的代碼如下:“全選”菜單項(xiàng)的Click事件過(guò)程中的代碼如下:PrivateSubmnuCut_Click()'將父窗體中活動(dòng)的子窗體中的選中文本復(fù)制到剪貼板Clipboard.SetTextMDIForm1.ActiveForm.ActiveControl.SelText'清除活動(dòng)窗體選中的文本MDIForm1.ActiveForm.ActiveControl.SelText=""EndSubPrivateSubmnuSelect_Click()'使用SelStart和SelLength選定文本MDIForm1.ActiveForm.Text1.SelStart=0MDIForm1.ActiveForm.Text1.SelLength=Len(MDIForm1.ActiveForm.Text1.Text)EndSub最后,在frmChild窗體的Form_Resize事件過(guò)程中添加如下代碼:上述代碼的作用是,當(dāng)子窗體的尺寸改變時(shí),其中的文本框也跟著改變。PrivateSubForm_Resize()MDIForm1.ActiveForm.Text1.Left=MDIForm1.ActiveForm.ScaleLeftMDIForm1.ActiveForm.Text1.Top=MDIForm1.ActiveForm.ScaleTopMDIForm1.ActiveForm.Text1.Width=MDIForm1.ActiveForm.ScaleWidthMDIForm1.ActiveForm.Text1.Height=MDIForm1.ActiveForm.ScaleHeightEndSub12.3.3MDI窗體及子窗體1.加載MDI窗體及子窗體加載子窗體時(shí),其父窗體(MDI窗體)會(huì)自動(dòng)加載并顯示。而加載MDI窗體時(shí),其子窗體并不會(huì)自動(dòng)加載。在例12.3中,子窗體是缺省的啟動(dòng)窗體,因而在程序運(yùn)行時(shí),子窗體和MDI窗體兩者都會(huì)加載。如果在應(yīng)用程序中改變啟動(dòng)窗體為MDIForm1,然后運(yùn)行應(yīng)用程序,則只有MDI窗體被加載。當(dāng)從“文件”菜單中選取“新建”命令時(shí),才會(huì)加載第一個(gè)子窗體。MDI窗體有AutoShowChildren屬性,決定是否自動(dòng)顯示子窗體。如果該屬性被設(shè)置為T(mén)rue,則當(dāng)改變子窗體的屬性(如Caption等)后,會(huì)自動(dòng)顯示該子窗體,不再需要使用Show方法;如果設(shè)置該屬性為False,則改變子窗體的屬性值后,不會(huì)自動(dòng)顯示該子窗體,子窗體處于隱藏狀態(tài),直至用Show方法把它們顯示出來(lái)。這就允許在子窗體變成可見(jiàn)之前更新標(biāo)題、位置和菜單等各種細(xì)節(jié)。2.設(shè)置子窗體的大小和位置如果MDI子窗體具有大小可變的邊框〔即BorderStyle=2〕,在其裝載時(shí),Windows將決定其初始的高度、寬度和位置。邊框大小可變的子窗體,其初始大小與位置取決于MDI窗體的大小,而不是設(shè)計(jì)時(shí)子窗體的大小。當(dāng)MDI子窗體的邊框大小不可變(即BorderStyle=0、1或3)時(shí),則它將用設(shè)計(jì)時(shí)的Height和Width屬性被載入。如果設(shè)置AutoShowChildren為False,則在MDI子窗體載入以后,把它設(shè)為可見(jiàn)狀態(tài)之前,可以改變其大小和位置。定位窗體的代碼最好放在窗體的Load過(guò)程中,這樣會(huì)在窗體實(shí)際出現(xiàn)在屏幕上之前將窗體位置確定。要將窗體居中,需要在窗體的Load過(guò)程中簡(jiǎn)單地添加代碼來(lái)計(jì)算并指定窗體左上角的位置,如下列代碼所示:利用坐標(biāo)系統(tǒng)可以將窗體定位于屏幕或MDI窗體的任意位置。Me.Left=(Screen.Width-Me.Width)/2Me.Top=(Screen.Height-Me.Height)/23.MDI窗體程序子窗體的排列順序和方式在MDI應(yīng)用程序中,缺省狀態(tài)下子窗體是按照窗口打開(kāi)的順序排列的:當(dāng)前活動(dòng)窗體排在最前端,最先打開(kāi)的窗體排在最底端。我們可以借助ZOrder方法動(dòng)態(tài)地改變子窗體的排列順序。ZOrder方法的語(yǔ)法為:其中,Position取值為0時(shí)表示對(duì)象移至最前端,為1時(shí)表示對(duì)象移至最底端,缺省時(shí)值為0。例如,某一MDI應(yīng)用程序有三個(gè)子窗體:Form1、Form2和Form3,若要將Form3移至最底端,則可在設(shè)計(jì)代碼時(shí)加上Form3.Zorder1即可。利用Zorder方法我們也可以創(chuàng)建浮動(dòng)窗體,浮動(dòng)窗體總是浮動(dòng)到表面,也就是說(shuō)它可以被其他窗體覆蓋,但馬上自動(dòng)變成當(dāng)前窗口并顯示在所有窗體的最上層。窗體名稱.ZOrder[Position]要?jiǎng)?chuàng)建浮動(dòng)窗體,需要在窗體上添加一個(gè)定時(shí)器控件,并將它的Interval屬性設(shè)置為想讓窗體浮現(xiàn)的時(shí)間,如500毫秒。在Timer1_Timer事件過(guò)程中編寫(xiě)如下代碼,便可以使用ZOrder方法使窗體浮動(dòng)到頂部:使用過(guò)Word的用戶都知道,Word可同時(shí)打開(kāi)多個(gè)文檔,并能以不同方式對(duì)文檔窗口進(jìn)行排列,如平鋪、層疊等。這種重新排列子窗體的功能,在MDI應(yīng)用程序中是可以通過(guò)編程來(lái)實(shí)現(xiàn)的。具體方法就是在相應(yīng)的菜單控件的Click事件中調(diào)用Arrange方法,使用Arrange方法可以重新對(duì)齊子窗體,可以層疊、水平平鋪或者沿著MDI窗體的下部排列子窗體圖標(biāo)等方式來(lái)顯示子窗體。Arrange方法的語(yǔ)法為:PrivateSubTimer1_Timer()ZOrderEndSubMDI窗體對(duì)象.ArrangeArrangement其中,Arrangement用來(lái)指定如何排列MDI應(yīng)用程序的子窗體,其值可以是常數(shù)或數(shù)值,Arrangement的取值如下表所示。常數(shù)值描述vbCascade0層疊所有非最小化MDI子窗體vbTileHorizontal1水平平鋪所有非最小化MDI子窗體vbTileVertical2垂直平鋪所有非最小化MDI子窗體vbArrangeIcons3重排最小化MDI子窗體的圖標(biāo)Arrangement的取值例如:若“平鋪”菜單項(xiàng)名為mnuHorizon,可編寫(xiě)如下代碼,實(shí)現(xiàn)子窗體的平鋪:當(dāng)平鋪或者層疊有著固定邊框類型的子窗體時(shí),每個(gè)子窗體都像具有可變尺寸邊框那樣被定位,這使得子窗體可能重疊。即使MDI窗體被最小化,仍可以重新排列窗口和圖標(biāo),當(dāng)MDI窗體最大化時(shí),可以看到重排的結(jié)果。PrivateSubmnuHorizon_Click()MDIForm1.ArrangevbTileHorizontal'MDIForm1為MDI窗體名稱EndSub4.維護(hù)子窗體的狀態(tài)信息當(dāng)子窗體被卸載時(shí),其中的內(nèi)容也會(huì)隨之消失,所以在用戶決定退出MDI應(yīng)用程序時(shí),必須有保存信息的機(jī)會(huì),讓用戶執(zhí)行存盤(pán)操作,這樣才能確保數(shù)據(jù)不會(huì)丟失。當(dāng)數(shù)據(jù)沒(méi)有改變而去存盤(pán)是沒(méi)有意義的,因此,應(yīng)用程序必須隨時(shí)都能確定自上次保存以來(lái)子窗體中的數(shù)據(jù)是否有改變。這可以通過(guò)在每個(gè)子窗體中聲明一個(gè)公用變量來(lái)實(shí)現(xiàn)此功能,例如:當(dāng)子窗體中的內(nèi)容改變時(shí),可將此變量設(shè)為T(mén)rue。在保存完數(shù)據(jù)后,再設(shè)為False。PublicDataChangeedAsBoolean在MDI應(yīng)用程序中,在關(guān)閉應(yīng)用程序時(shí),VisualBasic將試圖卸載MDI窗體,當(dāng)MDI窗體被卸載時(shí),QueryUnload事件首先為MDI窗體調(diào)用,然后再為每一個(gè)打開(kāi)的子窗體調(diào)用。如果在這些QueryUnload事件過(guò)程中沒(méi)有代碼,則取消Unload事件,然后,每一個(gè)子窗體被卸載,最后MDI窗體被卸載。由于QueryUnload事件在窗體卸載之前被調(diào)用,因此在窗體卸載前可以給用戶一個(gè)保存窗體、文件和一些數(shù)據(jù)的機(jī)會(huì)。我們可以在該事件過(guò)程中,判斷前面聲明的那個(gè)公用變量標(biāo)志,然后提示用戶是否執(zhí)行保存操作,也可以在窗體的卸載事件(Unload)中判斷此變量標(biāo)志,這樣,在MDI應(yīng)用程序退出時(shí)就不會(huì)丟失數(shù)據(jù)了。5.顯示所有已打開(kāi)子窗體標(biāo)題如果想要實(shí)現(xiàn)這一功能,只要在設(shè)計(jì)MDI窗體及子窗體時(shí)的“窗口”菜單時(shí),將WindowList屬性設(shè)置為T(mén)rue(即選中該復(fù)選框)即可。在運(yùn)行時(shí),VisualBasic自動(dòng)管理與顯示標(biāo)題清單,并在當(dāng)前正有焦點(diǎn)的標(biāo)題旁邊顯示一個(gè)復(fù)選標(biāo)志。另外,還在窗口清單的上方自動(dòng)放置一個(gè)分隔符條。WindowList屬性在運(yùn)行時(shí)是只讀的,只能在設(shè)計(jì)時(shí)設(shè)置。只能將菜單欄中的某一個(gè)菜單的WindowList屬性設(shè)置為T(mén)rue,打開(kāi)窗口的列表只出現(xiàn)在WindowList屬性設(shè)置為T(mén)rue的菜單對(duì)象中,如果單擊窗口列表中的某一個(gè)窗體名稱,就可以激活那個(gè)窗體。12.3.4MDI窗體的菜單和工具欄設(shè)計(jì)MDI應(yīng)用程序的菜單設(shè)計(jì)與一般應(yīng)用程序的菜單設(shè)計(jì)方法一致,可利用“菜單編輯器”來(lái)完成,但MDI應(yīng)用程序的菜單還有其特殊性。在MDI應(yīng)用程序中,每一個(gè)子窗體的菜單都顯示在MDI窗體上,而不是在子窗體本身。當(dāng)子窗體有焦點(diǎn)時(shí),該子窗體的菜單(如果有的話)就代替菜單欄上的MDI窗體的菜單。如果沒(méi)有可見(jiàn)的子窗體,或者帶有焦點(diǎn)的子窗體沒(méi)有菜單,則顯示MDI窗體的菜單。MDI應(yīng)用程序使用幾套菜單的情況很普遍。當(dāng)打開(kāi)一個(gè)文檔時(shí),應(yīng)用程序顯示與該類文檔相關(guān)的菜單。通常,沒(méi)有可見(jiàn)子窗體時(shí)會(huì)顯示一個(gè)不同的菜單。例如,當(dāng)沒(méi)有文件打開(kāi)時(shí),MicrosoftExcel只顯示“文件”與“幫助”菜單。當(dāng)用戶打開(kāi)一個(gè)文件時(shí),其他菜單就會(huì)顯示出來(lái),如“文件”、“編輯”、“視圖”、“插入”、“格式”、“工具”和“窗口”等。管理MDI應(yīng)用程序中菜單的一個(gè)方法是把希望在任何時(shí)候都顯示的菜單控件放在MDI窗體上,當(dāng)運(yùn)行該應(yīng)用程序時(shí),如果沒(méi)有可見(jiàn)的子窗體,會(huì)自動(dòng)顯示MDI窗體菜單。把應(yīng)用于子窗體的菜單控件放置到子窗體中,在運(yùn)行時(shí),只要有一個(gè)子窗體可見(jiàn),這些菜單標(biāo)題就會(huì)顯示在MDI窗體的菜單欄中。雖然子窗體的菜單可替代主窗體的菜單,但在編寫(xiě)菜單命令的響應(yīng)事件的處理時(shí)卻不相同。在VisualBasic中,只能在本窗體內(nèi)響應(yīng)菜單命令,因此主菜單的命令處理只能在主窗體模塊中進(jìn)行,而子窗體的命令處理只能在子窗體模塊中進(jìn)行。即使子窗體的菜單顯示在主窗體的菜單位置,但它還是子窗體的菜單。有些應(yīng)用程序支持多種類型的文檔。例如,在MicrosoftAccess中,可以打開(kāi)表格、查詢、窗體和其他文檔類型。要在VisualBasic中創(chuàng)建這樣的應(yīng)用程序,應(yīng)使用兩個(gè)子窗體。設(shè)計(jì)一個(gè)帶有執(zhí)行工作單任務(wù)菜單的子窗體和另一個(gè)帶有完成圖表任務(wù)菜單的子窗體。在運(yùn)行時(shí),當(dāng)工作單窗體的實(shí)例有焦點(diǎn)時(shí),則顯示工作單菜單,而當(dāng)選取圖表時(shí),則顯示圖表窗體的菜單。如果所有的工作單和圖表都關(guān)閉,則顯示MDI窗體的菜單。大多數(shù)MDI應(yīng)用程序的菜單欄中都有“窗口”這一特殊菜單項(xiàng),這是一個(gè)顯示所有打開(kāi)的子窗體標(biāo)題的特殊菜單,如下圖所示。另外,有些應(yīng)用程序?qū)⒉倏v子窗體的命令,比如“層疊”、“平鋪”與“排列圖標(biāo)”,也放在這個(gè)菜單中。工具欄(也稱為發(fā)條或者控制欄)已經(jīng)成為許多基于Windows的應(yīng)用程序的標(biāo)準(zhǔn)功能,它提供了應(yīng)用程序中最常用的功能。利用工具欄可以對(duì)應(yīng)用程序中最常用的命令快速訪問(wèn),還可以進(jìn)一步增強(qiáng)應(yīng)用程序的界面。VisualBasic中的“窗口”菜單創(chuàng)建工具欄的方法有兩種:手工創(chuàng)建或使用ToolBar等控件創(chuàng)建。1.手工創(chuàng)建工具欄手工創(chuàng)建工具欄是利用圖片框和命令按鈕或圖像框控件制作,比較煩瑣。具體步驟如下:(1)在MDI窗體上放置一個(gè)圖片框(PictureBox)控件,并設(shè)置其Align屬性,通常Align屬性可以設(shè)置為1或2。當(dāng)Align屬性值為1時(shí),圖片框的寬度會(huì)沿MDI窗體頂端自動(dòng)伸展,直到填滿MDI窗體工作空間;當(dāng)Align屬性值為2時(shí),圖片框的寬度會(huì)沿MDI窗體底端自動(dòng)伸展,直到填滿MDI窗體工作空間。工作空間就是窗體邊框以內(nèi)的區(qū)域,不包括標(biāo)題條、菜單欄或所有的工具欄、狀態(tài)欄或者可能在窗體上的滾動(dòng)條。前面我們說(shuō)過(guò),只能把那些直接支持Align屬性的控件放置在MDI窗體上,而圖片框是支持這一屬性的唯一的標(biāo)準(zhǔn)控件。(2)在圖片框中,可以放置任何想在工具欄上顯示的控件。典型地,用命令按鈕或Image控件來(lái)創(chuàng)建工具欄按鈕。要在圖片框中添加控件,單擊工具欄中的控件按鈕,然后在圖片框中畫(huà)出它。(3)設(shè)置設(shè)計(jì)時(shí)屬性。使用工具欄的一個(gè)好處是可以顯示一個(gè)形象的命令圖示,Image控件是作為工具欄按鈕的一個(gè)很好的選擇,因?yàn)榭梢杂盟鼇?lái)顯示一個(gè)位圖。在設(shè)計(jì)時(shí)設(shè)置其Picture屬性來(lái)顯示一個(gè)位圖,再通過(guò)設(shè)置工具欄按鈕的ToolTipText屬性,實(shí)現(xiàn)自動(dòng)提示功能。設(shè)置工具欄按鈕的ToolTipText屬性后,運(yùn)行時(shí)當(dāng)用戶把鼠標(biāo)指針停留在該按鈕上時(shí),就可以自動(dòng)顯示ToolTipText屬性的內(nèi)容。(4)調(diào)整各工具欄按鈕的位置和大?。ㄒ部梢栽贔orm_Load事件過(guò)程中編程實(shí)現(xiàn))。(5)編寫(xiě)各工具欄按鈕的代碼。因?yàn)楣ぞ邫陬l繁地用于提供訪問(wèn)某些應(yīng)用程序命令的快捷方法,因而在大部分時(shí)間內(nèi)都是在按鈕的Click事件中調(diào)用其他過(guò)程。例如,在VisualBasic的工具欄上的“保存”按鈕,它的功能和“文件”菜單中“保存工程”菜單項(xiàng)的功能完全一樣。與其把這些功能代碼重復(fù)兩次,還不如把代碼放到窗體的一個(gè)公用過(guò)程中,然后在上面的任何一個(gè)事件過(guò)程調(diào)用這個(gè)過(guò)程。下圖是一個(gè)含有Image控件的工具欄。手工創(chuàng)建的工具欄2.使用ToolBar和ImageList控件創(chuàng)建工具欄使用ToolBar控件創(chuàng)建工具欄非常容易且很方便,它在VisualBasic的專業(yè)版與企業(yè)版中是可用的。使用這種方法創(chuàng)建工具欄比手工創(chuàng)建要方便得多,而且外形更美觀,更接近于Windows的風(fēng)格。ToolBar控件包含用來(lái)創(chuàng)建工具欄的按鈕對(duì)象的集合,也就是顯示在工具欄上的一組按鈕。每個(gè)按鈕對(duì)象都可有圖像、標(biāo)題和提示,其中,圖像是由相關(guān)的ImageList控件所提供。使用ToolBar和ImageList控件來(lái)創(chuàng)建工具欄的步驟如下:(1)鼠標(biāo)右鍵單擊工具箱,選“部件”命令,打開(kāi)“部件”對(duì)話框(也可以在“工程”菜單中選擇“部件”菜單項(xiàng)打開(kāi))。單擊“部件”對(duì)話框的“控件”選項(xiàng)卡,在控件的列表里選中“MicrosoftWindowsControls6.0”復(fù)選框,將ToolBar和ImageList等控件添加到工具箱,新添加的控件如右圖所示。工具箱(2)分別雙擊ToolBar和ImageList控件,把它們添加到窗體上。(3)設(shè)置ImageList控件的屬性。ImageList控件不單獨(dú)使用,專門(mén)為其他控件提供圖像庫(kù),是一個(gè)圖像容器控件。工具欄按鈕的圖像就是通過(guò)ToolBar控件從ImageList控件的圖像庫(kù)中獲得的。用鼠標(biāo)右鍵單擊ImageList控件,選擇“屬性”命令,可以打開(kāi)“屬性頁(yè)”對(duì)話框,在“屬性頁(yè)”對(duì)話框里設(shè)置ImageList控件的屬性。該對(duì)話框包括三個(gè)選項(xiàng)卡:通用、圖像和顏色。其中“通用”選項(xiàng)卡用于設(shè)置圖片大小,“圖像”選項(xiàng)卡用于插入圖片,“圖像”選項(xiàng)卡如下圖所示。ImageList控件的“圖像”選項(xiàng)卡在“圖像”選項(xiàng)卡中,單擊“插入圖片”按鈕,選擇希望作為工具欄按鈕圖標(biāo)的圖片,圖像文件的擴(kuò)展名為.ico、.bmp、.gif、.jpg等。插入圖片后,“索引”框?qū)?開(kāi)始,按插入順序自動(dòng)編號(hào),此編號(hào)與ToolBar控件屬性頁(yè)中“按鈕”選擇項(xiàng)的“圖像”框中的數(shù)字相對(duì)應(yīng),“圖像”框中的數(shù)字為1,則工具欄上該按鈕的圖標(biāo)就是ImageList控件中索引值為1的圖片。“關(guān)鍵字”表示每個(gè)圖像的標(biāo)識(shí)名,可以在ToolBar控件中引用。“刪除圖片”按鈕,用于刪除選中的圖片。“圖像數(shù)”表示已經(jīng)插入的圖像數(shù)目。(4)右擊ToolBar控件,選擇“屬性”,打開(kāi)ToolBar控件的屬性頁(yè)對(duì)話框。它也有三個(gè)選項(xiàng)卡:通用、按鈕和圖片。單擊“通用”選項(xiàng)卡,在“圖像列表”下拉框中選擇所需要的ImageList控件,建立ImageList控件與ToolBar控件間的關(guān)聯(lián),如右圖所示。ToolBar控件的“通用”選項(xiàng)卡在“樣式”下拉框中可以選擇工具欄的不同樣式:0-tbrStandard型或1-tbrFlat型。0-tbrStandard型工具欄按鈕呈突出狀,單擊時(shí)有按下并彈起的效果;1-tbrFlat型則呈平面,當(dāng)鼠標(biāo)移至按鈕上方時(shí),按鈕突出顯示,與Windows95下的工具欄按鈕風(fēng)格類似。“可換行的”復(fù)選框被選中表示當(dāng)工具欄的長(zhǎng)度不能容納所有工具按鈕時(shí),在下一行顯示。如果不選中該復(fù)選框,則當(dāng)工具欄的長(zhǎng)度不能容納所有工具按鈕時(shí),剩余的就不再顯示。切換到“按鈕”選項(xiàng)卡,如下圖所示。ToolBar控件的“按鈕”選項(xiàng)卡最開(kāi)始
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Trilysine-TFA-生命科學(xué)試劑-MCE-4187
- KIF18A-IN-15-生命科學(xué)試劑-MCE-5317
- 4-4-Dimethoxyoctafluorobiphenyl-生命科學(xué)試劑-MCE-5198
- 1-3-Dinervonoyl-glycerol-生命科學(xué)試劑-MCE-1243
- 2025年度特色民宿體驗(yàn)住宿協(xié)議
- 二零二五年度消防設(shè)備定制設(shè)計(jì)與銷售合同
- 二零二五年度農(nóng)產(chǎn)品線上線下一體化購(gòu)銷合同標(biāo)準(zhǔn)
- 施工現(xiàn)場(chǎng)施工防傳染病傳播制度
- 個(gè)人兼職用工合同模板
- 鄉(xiāng)村別墅租賃合同樣本
- 2025年上半年山東氣象局應(yīng)屆高校畢業(yè)生招考易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 人教版2024-2025學(xué)年八年級(jí)上學(xué)期數(shù)學(xué)期末壓軸題練習(xí)
- 【人教版化學(xué)】必修1 知識(shí)點(diǎn)默寫(xiě)小紙條(答案背誦版)
- 江蘇省無(wú)錫市2023-2024學(xué)年八年級(jí)上學(xué)期期末數(shù)學(xué)試題(原卷版)
- 全國(guó)第三屆職業(yè)技能大賽(無(wú)人機(jī)駕駛(植保)項(xiàng)目)選拔賽理論考試題庫(kù)(含答案)
- 對(duì)口升學(xué)語(yǔ)文模擬試卷(10)-江西?。ń馕霭妫?/a>
- 成長(zhǎng)感恩責(zé)任高中主題班會(huì)-課件
- 建設(shè)項(xiàng)目全過(guò)程工程咨詢服務(wù)指引(咨詢企業(yè)版)(征求意見(jiàn)稿)
- 分手的協(xié)議書(shū)模板(5篇)
- 2020年度安徽省中考數(shù)學(xué)科目試卷
- 2023年山東藥品食品職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試筆試題庫(kù)及答案解析
評(píng)論
0/150
提交評(píng)論