摘要:Visual Basic 2005-如何將 Windows Form 表單模擬成一個 IE 瀏覽器
在撰寫「Visual Basic 2005 程式開發與介面設計秘訣」一書時突發奇想,是不是可以將 Windows Form 表單模擬成一個 IE 瀏覽器呢?其實在有了 WebBrowser 控制項之後,這樣的想法不難達成。不過問題在於,我們如何取得電腦中的「我的最愛」資訊,並將其階層式內容透過 MenuStrip 控制項來呈現呢?而且如何讓使用者透過我們提供的功能表來組織我的最愛呢?
圖表 1
圖表 2
程式範例 CH5_DemoForm002.vb 是我們的具體實作(如圖表 1 所示),它提供了完整的「我的最愛」資訊,而且也提供具備實際功能的「加到我的最愛」與「組織我的最愛」功能表項目。程式範例 CH5_DemoForm002.vb 的功能特性與撰寫技巧說明如下:
- 圖表 2 所示者是程式範例 CH5_DemoForm002.vb 的執行畫面,我們發現「我的最愛」主功能表項目之下會將您電腦中的「我的最愛」資訊完整呈現出來,而且當選取某一個功能表項目時,也會立即導覽至該所代表的網頁。
大家必須瞭解,您在 Microsoft Internet Explorer 中所組織出的「我的最愛」資訊其實是以目錄結構的形式儲存於您的電腦中,所以我們只需將該目錄結構轉換成「我的最愛」主功能表項目之下的下拉式功能表即可。基本上,我們是利用 Environment.SpecialFolder.Favorites 來取得「我的最愛」之目錄結構的位置,然後透過遞迴呼叫的方式,將它們轉換成功能表。相關程式碼列示如下:
Private Sub CH5_DemoForm002_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
…
…
' 取得我的最愛系統資料夾路徑。
Dim myFavDir As DirectoryInfo = New _
DirectoryInfo(Environment.GetFolderPath( _
Environment.SpecialFolder.Favorites))
RefreshDir(myFavDir)
End Sub
Private Sub RefreshDir(ByVal myFavDir As DirectoryInfo)
' 清除所有的ToolStripMenuItem。
Me.tsmiFavorite.DropDownItems.Clear()
Me.addToFavoritesToolStripMenuItem.Name = _
"addToFavoritesToolStripMenuItem"
Me.addToFavoritesToolStripMenuItem.Size = _
New System.Drawing.Size(167, 22)
Me.addToFavoritesToolStripMenuItem.Text = _
"加到我的最愛(&A)..."
' 加入ToolStripMenuItem。
Me.tsmiFavorite.DropDownItems.Add( _
addToFavoritesToolStripMenuItem)
Me.organizeFavoritesToolStripMenuItem.Name = _
"organizeFavoritesToolStripMenuItem"
Me.organizeFavoritesToolStripMenuItem.Size = _
New System.Drawing.Size(167, 22)
Me.organizeFavoritesToolStripMenuItem.Text = _
"組織我的最愛(&O)..."
' 加入ToolStripMenuItem。
Me.tsmiFavorite.DropDownItems.Add( _
organizeFavoritesToolStripMenuItem)
Me.toolStripMenuItem13.Name = "toolStripMenuItem13"
Me.toolStripMenuItem13.Size = _
New System.Drawing.Size(164, 6)
' 加入ToolStripMenuItem。
Me.tsmiFavorite.DropDownItems.Add(toolStripMenuItem13)
Dim myFileSystemInfo As FileSystemInfo() = _
myFavDir.GetFileSystemInfos()
GetDir(myFileSystemInfo, tsmiFavorite)
End Sub
Private Sub GetDir(ByVal myFavDir As FileSystemInfo(), _
ByVal myToolStripMenuItem As ToolStripMenuItem)
Dim myStr, myUrl, myDescription As String
Dim URLPrefix As String = "url="
Dim DescriptionPrefix As String = "description="
If myFavDir Is Nothing Then
Throw New ArgumentNullException("myFavDir")
End If
Dim FileSystemInfo As FileSystemInfo
Dim ItemIndex As Integer = 1
For Each FileSystemInfo In myFavDir
' 判斷是否為目錄。
If TypeOf FileSystemInfo Is DirectoryInfo Then
Dim FileToolStripMenuItem As ToolStripMenuItem = _
New ToolStripMenuItem( _
FileSystemInfo.ToString, My.Resources.Folder16)
myToolStripMenuItem.DropDownItems.Add( _
FileToolStripMenuItem)
Dim dInfo As DirectoryInfo = _
CType(FileSystemInfo, DirectoryInfo)
' 遞迴呼叫方法顯示所有的子目錄內容。
GetDir( _
dInfo.GetFileSystemInfos(), FileToolStripMenuItem)
' 判斷是否為檔案。
ElseIf TypeOf FileSystemInfo Is FileInfo Then
myUrl = ""
myDescription = ""
Using SR As New StreamReader( _
FileSystemInfo.FullName, Encoding.Default)
myStr = SR.ReadLine
Do Until myStr Is Nothing
If myStr.ToLower.StartsWith(URLPrefix) Then
myUrl = myStr.Substring(URLPrefix.Length)
ElseIf myStr.ToLower.StartsWith(DescriptionPrefix) Then
myDescription = _
myStr.Substring(DescriptionPrefix.Length)
End If
myStr = SR.ReadLine
Loop
End Using
Dim FileToolStripMenuItem As ToolStripMenuItem = _
New ToolStripMenuItem( _
FileSystemInfo.ToString.Substring( _
0, FileSystemInfo.ToString.LastIndexOf(".")), _
My.Resources.link16, New EventHandler( _
AddressOf FileToolStripMenuItem_Click))
' 將Url指派給功能表項目的Tag屬性。
FileToolStripMenuItem.Tag = myUrl
' 將Url指派給功能表項目的ToolTipText屬性。
FileToolStripMenuItem.ToolTipText = myUrl
myToolStripMenuItem.DropDownItems.Add( _
FileToolStripMenuItem)
End If
ItemIndex += 1
Next FileSystemInfo
End Sub
Sub FileToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs)
Me.webBrowser1.Navigate( _
CType(sender, ToolStripMenuItem).Tag.ToString)
End Sub
- 本程式範例的另外兩項重要功能,就是可以實際執行「加到我的最愛」與「組織我的最愛」兩項作業(如圖表 3 與 4 所示)。相關程式碼列示如下:
Private Declare Function DoOrganizeFavDlg Lib "shdocvw" _
(ByVal hWnd As IntPtr, ByVal lpszRootFolder As String) As Int32
' 加到我的最愛。
Private Sub addToFavoritesToolStripMenuItem_Click( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles addToFavoritesToolStripMenuItem.Click
Dim shl As SHDocVw.ShellUIHelper = _
New SHDocVw.ShellUIHelper()
Dim title As Object = CObj(webBrowser1.DocumentTitle)
shl.AddFavorite(webBrowser1.Url.ToString(), title)
Dim myFavDir As DirectoryInfo = New _
DirectoryInfo(Environment.GetFolderPath( _
Environment.SpecialFolder.Favorites))
RefreshDir(myFavDir)
End Sub
' 組織我的最愛。
Private Sub organizeFavoritesToolStripMenuItem_Click( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles organizeFavoritesToolStripMenuItem.Click
Dim success As Int32
Dim myFavDir As DirectoryInfo = New _
DirectoryInfo(Environment.GetFolderPath( _
Environment.SpecialFolder.Favorites))
success = DoOrganizeFavDlg(Me.Handle, _
Environment.GetFolderPath( _
Environment.SpecialFolder.Favorites))
RefreshDir(myFavDir)
End Sub
圖表 3
圖表 4