国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
VB- 用戶界面
界面樣式

    如果使用過基于 Windows 的應(yīng)用程序,也許已經(jīng)注意到不是所有用戶界面看上去或操作起來都一樣。用戶界面樣式主要有兩種:單文檔界面 (SDI) 和多文檔界面 (MDI)。SDI 界面的一個示例就是 Microsoft Windows 中的WordPad(記事本)應(yīng)用程序(圖 6.1)。在 WordPad 中,只能打開一個文檔,想要打開另一個文檔時,必須先關(guān)上已打開的文檔。


    象 Microsoft Excel 和 Microsoft Word for Windows 這樣的應(yīng)用程序就是MDI 界面;它們允許同時顯示多個文檔,每一個文檔都顯示在自己的窗口中(圖 6.2)。按照是否包含有能在窗口或文檔之間進行切換的子菜單的Windows 菜單項,就能識別出 MDI 應(yīng)用程序。
    要決定哪種界面樣式最好,需要看應(yīng)用程序的目的。一個處理保險索賠的應(yīng)用程序可能要用多文檔界面 MDI 樣式,一個職員很可能會同時處理一個以上索賠,或者需要對兩個索賠進行比較。另一方面,日歷程序最好設(shè)成 SDI(單文檔界面)樣式,因為不大需要同時打開一個以上日歷;在極少的情況下,可以再打開一個單文檔界面應(yīng)用程序的實例。

    SDI 樣式更常用,《程序員指南》中的大多數(shù)實例都采用 SDI 應(yīng)用程序。關(guān)于創(chuàng)建 MDI 應(yīng)用程序有一些需要單獨考慮的問題和技巧,放在本章后面“多文檔界面 (MDI) 應(yīng)用程序”一節(jié)。
    除了以上兩個最常用的界面樣式 SDI 與 MDI 外,第三種界面樣式變得越來越流行,這就是資源管理器樣式的界面(圖 6.3)。資源管理器樣式界面是包括有兩個窗格或者區(qū)域的一個單獨的窗口, 通常是由左半部分的一個樹型的或者層次型的視圖和右半部分的一個顯示區(qū)所組成,如在 MicrosoftWindows 的資源管理器中所見到的那樣。這種樣式的界面可用于定位或瀏覽大量的文檔、圖片或文件?!   〕吮菊滤降?MDI 與 SDI 應(yīng)用程序示例,實用程序向?qū)н€提供了一種比較界面樣式差別的方法。可以用向?qū)頌槊恳环N樣式生成一個框架,然后觀察它生成的窗體與代碼。

    詳細(xì)信息 要了解更多的關(guān)于 MDI 應(yīng)用程序的知識,請參閱“多文檔界面 (MDI) 應(yīng)用程序”一節(jié)。有關(guān)窗體使用的基礎(chǔ),請參閱第三章“窗體、控件與菜單”。有關(guān)訪問實用程序向?qū)У男畔?,請參閱第四?#8220;工程的管理”中“使用向?qū)Ш屯饨映绦?#8221;一節(jié)。

多文檔界面 (MDI) 應(yīng)用程序

    多文檔界面 (MDI) 允許創(chuàng)建在單個容器窗體中包含多個窗體的應(yīng)用程序。像Microsoft Excel 與 Microsoft Word for Windows 這樣的應(yīng)用程序就具有多文檔界面。
    MDI 應(yīng)用程序允許用戶同時顯示多個文檔,每個文檔顯示在它自己的窗口中。文檔或子窗口被包含在父窗口中,父窗口為應(yīng)用程序中所有的子窗口提供工作空間。例如:Microsoft Excel 允許創(chuàng)建并顯示不同樣式的多文檔窗口。每個子窗口都被限制在 Excel 父窗口的區(qū)域之內(nèi)。當(dāng)最小化 Excel時,所有的文檔窗口也被最小化,只有父窗口的圖標(biāo)顯示在任務(wù)欄中。子窗體就是 MDIChild 屬性設(shè)置為 True 的普通窗體。一個應(yīng)用程序可以包含許多相似或者不同樣式的 MDI 子窗體。
    在運行時,子窗體顯示在 MDI 父窗體工作空間之內(nèi)(其區(qū)域在父窗體邊框以內(nèi)及標(biāo)題與菜單欄之下)。當(dāng)子窗體最小化時,它的圖標(biāo)顯示在 MDI 窗體的工作空間之內(nèi),而不是在任務(wù)欄中,如圖 6.4 所示。

    注意 一個應(yīng)用程序也可以包括標(biāo)準(zhǔn)的、不是包含在 MDI 窗體之內(nèi)的非MDI 窗體。 MDI 應(yīng)用程序中標(biāo)準(zhǔn)窗體的典型用法是顯示       模式的對話框。
    MDI 窗體相似于具有一個限制條件的普通窗體。除非控件具有 Align 屬性(如 PictureBox 控件)或者具有不可見界面(如 Timer 控件),否則不能將控件直接放置在 MDI 窗體上。

    創(chuàng)建 MDI 應(yīng)用程序
    使用下列步驟來創(chuàng)建 MDI 窗體及其子窗體。
    要創(chuàng)建 MDI 應(yīng)用程序,請按照以下步驟執(zhí)行:
    1. 創(chuàng)建 MDI 窗體。
    從“工程”菜單中選取“添加 MDI 窗體”。
    注意 一個應(yīng)用程序只能有一個 MDI 窗體。如果工程已經(jīng)有了一個 MDI窗體,則該“工程”菜單上的“添加 MDI 窗體”命令就      不可使用。
    2. 創(chuàng)建應(yīng)用程序的子窗體。
     要創(chuàng)建一個 MDI 子窗體,先創(chuàng)建一個新窗體(或者打開一個存在的窗體),然后把它的 MDIChild 屬性設(shè)為 True。

    設(shè)計時使用 MDI 子窗體
    在設(shè)計時,子窗體不是限制在 MDI 窗體區(qū)域之內(nèi)??梢蕴砑涌丶⒃O(shè)置屬性、編寫代碼以及設(shè)計子窗體功能,就像在其它 Visual Basic 窗體中做的那樣。
    通過查看 MDIChild 屬性或者檢查工程資源管理器,可以確定窗體是否是一個 MDI 子窗體。如果該窗體的 MDIChild 屬性設(shè)置為 True,則它是一個子窗體。Visual Basic 在“工程資源管理器”中為 MDI 窗體與 MDI 子窗體顯示了特定的圖標(biāo),如圖 6.5 所示。

          圖 6.5 工程資源管理器中的圖標(biāo)標(biāo)明 MDI 子窗體、標(biāo)準(zhǔn)窗體和 MDI 窗體

    MDI 窗體運行時的特性
    在運行時,MDI 窗體及其所有的子窗體都呈現(xiàn)特定的性質(zhì):
    1.所有子窗體均顯示在 MDI 窗體的工作空間內(nèi)。像其它的窗體一樣,用戶能移動子窗體和改變子窗體的大小,不過,它們被限     制于這一工作空間內(nèi)。
    2.當(dāng)最小化一個子窗體時,它的圖標(biāo)將顯示于 MDI 窗體上而不是在任務(wù)欄中。當(dāng)最小化 MDI 窗體時,此 MDI 窗體及其所有子     窗體將由一個圖標(biāo)來代表。當(dāng)還原 MDI 窗體時,MDI 窗體及其所有子窗體將按最小化之前的狀態(tài)顯示出來。
    3.當(dāng)最大化一個子窗體時,它的標(biāo)題會與 MDI 窗體的標(biāo)題組合在一起并顯示于 MDI 窗體的標(biāo)題欄上(參見圖 6.6)。

    4.通過設(shè)定 AutoShowChildren 屬性,子窗體可以在窗體加載時自動顯示(True) 或自動隱藏 (False)。
    5.活動子窗體的菜單(若有)將顯示在 MDI 窗體的菜單欄中,而不是顯示在子窗體中。
MDI NotePad 應(yīng)用程序
    MDI NotePad 示例應(yīng)用程序是一個簡單的文本編輯器,它與 MicrosoftWindows 中包含的 NotePad 應(yīng)用程序相似。不過,MDI NotePad 應(yīng)用程序使用的是一個多文檔界面 (MDI)。在運行時,若用戶需要一個新文檔(用該應(yīng)用程序的“文件”菜單中的“新建”命令執(zhí)行),應(yīng)用程序就會創(chuàng)建子窗體的一個新實例。這就允許按其所需創(chuàng)建多個子窗體或文檔。
    在 Visual Basic 中為了創(chuàng)建以文檔為中心的應(yīng)用程序,至少需要兩個窗體:一個 MDI 窗體和一個子窗體。設(shè)計時,應(yīng)創(chuàng)建一個 MDI 窗體以容納該應(yīng)用程序,再創(chuàng)建一個子窗體作為這個應(yīng)用程序文檔的模板。
    要創(chuàng)建自己的 MDI NotePad 應(yīng)用程序,請按照以下步驟執(zhí)行:
    1. 從“文件”菜單中,選取“新建工程”命令。
    2. 從“工程”菜單中,選取“添加 MDI 窗體”命令來創(chuàng)建容器窗體?,F(xiàn)在,這個工程應(yīng)當(dāng)包含一個 MDI 窗體 (MDIForm1) 和     一個標(biāo)準(zhǔn)窗體(Form1)。
    3. 在 Form1 上創(chuàng)建一個文本框 (Text1)。
    4. 按下列方式為兩個窗體和文本框設(shè)置屬性。

    6. 在 mnuFileNew_Click 過程中增加以下代碼:
    Private Sub mnuFileNew_Click ()
      ' 創(chuàng)建名為 NewDoc 的窗體 Form1 的一個新實例。
      Dim NewDoc As New Form1
      ' 顯示此新窗體。
      NewDoc.Show
    End Sub
    這個過程創(chuàng)建并顯示 Form1 的名為 NewDoc 的一個新實例(或其副本)。每當(dāng)從“文件”菜單中選取“新建”命令時,將會創(chuàng)建一個與 Form1完全相同的副本(實例),它包含 Form1 所包含的所有控件和代碼。
    7. 給 Form1 窗體的 Form_Resize 過程添加以下代碼:
     Private Sub Form_Resize()
        ' 擴展文本框以放置當(dāng)前子窗體。
        Text1.Height = ScaleHeight
        Text1.Width = ScaleWidth
     End Sub
    Form_Resize 事件過程的代碼,像Form1 中的所有代碼一樣,能為 Form1的每一個實例所共享。當(dāng)顯示窗體的幾個副本時,每個窗體都能識別各自的事件。當(dāng)一個事件出現(xiàn)時,該事件過程的代碼就會被調(diào)用。由于相同的代碼為每個實例所共享,關(guān)于調(diào)用該代碼的窗體是如何引用的,尤其是每個實例都具有相同的名字 (Form1) 時。這個問題將在本章后面的“使用 MDI 窗體及其子窗體”一節(jié)中討論?!   ?. 按 F5 鍵可運行該應(yīng)用程序。
    提示 除了本章提到的以外,Mdinote.vbp 示例應(yīng)用程序還包含許多 MDI技巧?;ㄒ恍r間對該示例代碼進行全面研究會找到這些技巧。Sdinote.vbp 示例應(yīng)用程序是同一應(yīng)用程序轉(zhuǎn)換為 SDI 樣式的實現(xiàn);比較這兩個例子可以明白 MDI 和 SDI 技巧的差別。

    使用 MDI 窗體及其子窗體
    當(dāng) MDI 應(yīng)用程序在一次會話中要打開、保存和關(guān)閉幾個子窗體時,應(yīng)當(dāng)能夠引用活動窗體和保持關(guān)于子窗體的狀態(tài)信息。這個主題描述了一些用來指定活動子窗體或者控件、加載和卸載 MDI 窗體及其子窗體、以及保持子窗體的狀態(tài)信息的編碼技巧。

    指定活動子窗體或控件
    有時要提供一條命令,它用于對當(dāng)前活動子窗體上具有焦點的控件進行操作。例如,假設(shè)想從子窗體的文本框中把所選文本復(fù)制到剪貼板上。在Mdinote.vbp 示例應(yīng)用程序中,“編輯”菜單上的“復(fù)制”項的 Click 事件將會調(diào)用 EditCopyProc,它是把選定的文本復(fù)制到剪貼板上的過程。
    由于應(yīng)用程序可以有同一子窗體的許多實例,EditCopyProc 需要知道使用的是哪一個窗體。為了指定這一點,使用 MDI 窗體的 ActiveForm 屬性,該屬性可以返回具有焦點的或者最后被激活的子窗體。
    注意 當(dāng)訪問 ActiveForm 屬性時,至少應(yīng)有一個 MDI 子窗體被加載或可見,否則會返回一個錯誤。
    當(dāng)一個窗體中有幾個控件時,也需要指定哪個控件是活動的。像 ActiveForm屬性一樣,ActiveControl 屬性能返回活動子窗體上具有焦點的控件。下邊是副本例程的示例,從子窗體菜單、MDI 窗體菜單或者是工具欄按鈕上可對它進行調(diào)用。
    Private Sub EditCopyProc ()
      ' 將選定文本復(fù)制到剪貼板上。
      ClipBoard.SetText _
        frmMDI.ActiveForm.ActiveControl.SelText
    End Sub
    假如,正在編寫被多個窗體實例調(diào)用的代碼,不用窗體標(biāo)識符訪問窗體的控件或?qū)傩允且粋€好辦法。例如,用 Text1.Height 引用 Form1上文本框的高度,而不是使用 Form1.Text1.Height。這樣,該代碼總是影響當(dāng)前窗體。
    在代碼中指定當(dāng)前窗體的另一種方法是用 Me 關(guān)鍵字。用 Me 關(guān)鍵字來引用當(dāng)前其代碼正在運行的窗體。當(dāng)需要把當(dāng)前窗體實例的引用參數(shù)傳遞給過程時,這個關(guān)鍵字很有用。
    詳細(xì)信息 有關(guān)通過 Dim 語句用 New 關(guān)鍵字來創(chuàng)建多個窗體實例的信息,請參閱第五章“編程基礎(chǔ)”中的“變量、常數(shù)和數(shù)據(jù)類型概述”,以及《語言參考》的“Dim 語句”。有關(guān)通過 Dim 語句用 New 關(guān)鍵字來創(chuàng)建多個窗體實例的信息,請參閱“編程基礎(chǔ)”中的“變量、常數(shù)和數(shù)據(jù)類型概述”,和《語言參考》的“Dim 語句”。

    加載 MDI 窗體及其子窗體
    加載子窗體時,其父窗體(MDI 窗體)會自動加載并顯示。而加載 MDI 窗體時,其子窗體并不會自動加載。
    在 MDI NotePad 示例中,子窗體是缺省的啟動窗體,因而在程序運行時,子窗體和 MDI 窗體兩者都會加載。如果在 MDI NotePad 應(yīng)用程序中改變啟動窗體為 frmMDI(在“工程屬性”的“一般”選項卡上),然后運行應(yīng)用程序,則只有 MDI 窗體被加載。當(dāng)從“文件”菜單中選取“新建”命令時,才會加載第一個子窗體。
    AutoShowChildren 屬性可用來加載隱藏狀態(tài)的 MDI 子窗口,使它們處于隱藏狀態(tài)直至用 Show 方法把它們顯示出來。這就允許在子窗體變成可見之前更新標(biāo)題、位置和菜單等各種細(xì)節(jié)。
    不能把 MDI 子窗體或者 MDI 窗體顯示為模式窗體(用帶 vbModal 參數(shù)的 Show 方法)。如果想在 MDI 應(yīng)用程序中使用模式對話框,可使用MDIChild 屬性設(shè)置為 False 的窗體。

    設(shè)置子窗體的大小和位置
    如果 MDI 子窗體具有大小可變的邊框〔即 BorderStyle = 2),在其裝載時,Microsoft Windows 將決定其初始的高度、寬度和位置。邊框大小可變的子窗體,其初始大小與位置取決于 MDI 窗體的大小,而不是設(shè)計時子窗體的大小。當(dāng) MDI 子窗體的邊框大小不可變(即 BorderStyle = 0,1 或 3)時,則它將用設(shè)計時的 Height 和 Width 屬性被載入。
    如果設(shè)置 AutoShowChildren 為 False,則在 MDI 子窗體載入以后,把它設(shè)為可見狀態(tài)之前,可以改變其位置。
    詳細(xì)信息 請參閱《語言參考》的“AutoShowChildren 屬性”和“ Show 方法”。

    維護子窗體的狀態(tài)信息
    在用戶決定退出 MDI 應(yīng)用程序時,必須有保存信息的機會。為了使其能夠進行,應(yīng)用程序必須隨時都能確定自上次保存以來子窗體中的數(shù)據(jù)是否有改變。
    通過在每個子窗體中聲明一個公用變量來實現(xiàn)此功能。例如,可以在子窗體的聲明部分聲明一個變量:
    Public boolDirty As Boolean
    Text1 中的文本每改變一次時,子窗體文本框的 Change 事件就會將boolDirty 設(shè)置為 True??商砑哟舜a以指示自上次保存以來 Text1 的內(nèi)容已經(jīng)改變。
    Private Sub Text1_Change ()
       boolDirty = True
    End Sub
    反之,用戶每次保存子窗體的內(nèi)容時,文本框的 Change 事件就將 boolDirty設(shè)置為 False,以指示 Text1 的內(nèi)容不再需要保存。在下列代碼中,假設(shè)有一個叫做“保存”(mnuFileSave) 的菜單命令和一個用來保存文本框內(nèi)容的名為 FileSave 的過程:
    Sub mnuFileSave_Click ()
        '保存 Text1 的內(nèi)容。
        FileSave
        '設(shè)置狀態(tài)變量。
        boolDirty = False
    End Sub

    用 QueryUnload 卸載 MDI 窗體
    當(dāng)用戶決定退出應(yīng)用程序時,boolDirty 標(biāo)志就很有用了。當(dāng)用戶從 MDI 窗體的“控制”菜單中選取“關(guān)閉”,或者從提供的菜單項,例如“文件”菜單上的“退出”命令,上述情況就會出現(xiàn)。如果用戶使用 MDI 窗體的“控制”菜單來關(guān)閉應(yīng)用程序,Visual Basic 將試圖卸載 MDI 窗體。
    當(dāng) MDI 窗體被卸載時,QueryUnload 事件首先為 MDI 窗體調(diào)用,然后再為每一個打開的子窗體調(diào)用。如果在這些 QueryUnload 事件過程中沒有代碼,則取消 Unload 事件,然后,每一個子窗體被卸載,最后,MDI 窗體被卸載。
    由于 QueryUnload 事件在窗體卸載之前被調(diào)用,因此在窗體卸載前可以給用戶一個機會來保存窗體。下述代碼使用 boolDirty 標(biāo)志來決定是否要提醒用戶在子窗體卸載之前進行保存。請注意,可以在工程的任何地方訪問公共窗體級變量值。這個代碼假定有一個名叫 FileSave 的過程,它將 Text1的內(nèi)容保存到一個文件中。
    Private Sub mnuFExit_Click()
        '當(dāng)用戶在 MDI 應(yīng)用程序中選取“文件提出”命令時,卸載
        'MDI 窗體,為每個打開的子窗體調(diào)用 QueryUnload 事件。
        Unload frmMDI
        End
    End Sub
    Private Sub Form_QueryUnload(Cancel As Integer, _
        UnloadMode As Integer)
        If boolDirty Then
        '調(diào)用例程來詢問用戶且必要時保存文件。
        FileSave
        End If
    End Sub
    詳細(xì)信息 請參閱《語言參考》的“QueryUnload 事件”。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
《Visual Basic語言程序設(shè)計基礎(chǔ)(第3版)》第8章 窗體
C# winForm
多文檔窗體和控件布局
VB編程基礎(chǔ)教程17–創(chuàng)建對象 | 異次元軟件世界
在MDI應(yīng)用程序中如何判斷一個子窗體已經(jīng)打開
Delphi – 在DLL中保存并創(chuàng)建MDI子窗體
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服