程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB6 >> vb的用戶界面(二)

vb的用戶界面(二)

編輯:VB6

MDI NotePad應用程序
MDI NotePad 示例應用程序是一個簡單的文本編輯器,它與 MicrosoftWindows 中包含的 NotePad 應用程序相似。不過,MDI NotePad 應用程序使用的是一個多文檔界面 (MDI)。在運行時,若用戶需要一個新文檔(用該應用程序的“文件”菜單中的“新建”命令執行),應用程序就會創建子窗體的一個新實例。這就允許按其所需創建多個子窗體或文檔。
在 Visual Basic 中為了創建以文檔為中心的應用程序,至少需要兩個窗體:一個 MDI 窗體和一個子窗體。設計時,應創建一個 MDI 窗體以容納該應用程序,再創建一個子窗體作為這個應用程序文檔的模板。
要創建自己的 MDI NotePad 應用程序,請按照以下步驟執行:
1. 從“文件”菜單中,選取“新建工程”命令。
2. 從“工程”菜單中,選取“添加 MDI 窗體”命令來創建容器窗體。現在,這個工程應當包含一個 MDI 窗體 (MDIForm1) 和 一個標准窗體(Form1)。
3. 在 Form1 上創建一個文本框 (Text1)。
4. 按下列方式為兩個窗體和文本框設置屬性。

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

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

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

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

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

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

用 QueryUnload 卸載 MDI 窗體
當用戶決定退出應用程序時,boolDirty 標志就很有用了。當用戶從 MDI 窗體的“控制”菜單中選取“關閉”,或者從提供的菜單項,例如“文件”菜單上的“退出”命令,上述情況就會出現。如果用戶使用 MDI 窗體的“控制”菜單來關閉應用程序,Visual Basic 將試圖卸載 MDI 窗體。
當 MDI 窗體被卸載時,QueryUnload 事件首先為 MDI 窗體調用,然後再為每一個打開的子窗體調用。如果在這些 QueryUnload 事件過程中沒有代碼,則取消 Unload 事件,然後,每一個子窗體被卸載,最後,MDI 窗體被卸載。
由於 QueryUnload 事件在窗體卸載之前被調用,因此在窗體卸載前可以給用戶一個機會來保存窗體。下述代碼使用 boolDirty 標志來決定是否要提醒用戶在子窗體卸載之前進行保存。請注意,可以在工程的任何地方訪問公共窗體級變量值。這個代碼假定有一個名叫 FileSave 的過程,它將 Text1的內容保存到一個文件中。
Private Sub mnuFExit_Click()
'當用戶在 MDI 應用程序中選取“文件提出”命令時,卸載
'MDI 窗體,為每個打開的子窗體調用 QueryUnload 事件。
Unload frmMDI
End
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, _
UnloadMode As Integer)
If boolDirty Then
'調用例程來詢問用戶且必要時保存文件。
FileSave
End If
End Sub
詳細信息 請參閱《語言參考》的“QueryUnload 事件”。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved