Visual Basic 2005-如何將 Windows Form 表單模擬成一個 IE 瀏覽器

摘要: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

  • 本程式範例的另外兩項重要功能,就是可以實際執行「加到我的最愛」「組織我的最愛」兩項作業(如圖表 34 所示)。相關程式碼列示如下:

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