Colaboraciones en el Guille

Navegador Web escrito con Visual Basic 2005 Express Edition

[usando la clase WebBrowser, nueva en .NET Framework 2.0]

 

Fecha: 14/Dic/2005 (14 de Diciembre de 2005)
Autor: Emilio Pérez Egido (miliuco)

 


Resumen del ejercicio

Clase WebBrowser

La clase WebBrowser permite alojar páginas web, y cualquier otro documento que pueda ser mostrado por un navegador web, en aplicaciones de Windows Forms. El control WebBrowser tiene propiedades, métodos y eventos que permiten la navegación como, por ejemplo:

- Url
- Navigate
- GoBack
- GoForward
- GoHome
- Stop
- Refresh
- GoSearch

Los principales eventos que vamos a manejar son:

- Navigating: ocurre cuando WebBrowser está navegando hacia el documento nuevo
- Navigated: ocurre cuando WebBrowser ha navegado hasta el nuevo documento y ha comenzado a cargarlo, reemplazando al documento anterior
- DocumentCompleted: ocurre cuando se ha completado la carga de la página

Clase HtmlWindow

Representa la ventana lógica que contiene una o más instancias de HtmlDocument (WebBrowser.Document) y no se debe confundir con la ventana del Windows Form o de API Win32. HtmlWindow proporciona capacidades de alto nivel para conocer o manipular un documento web mostrado en un control WebBrowser.
HtmlWindow se puede usar para abrir ventanas nuevas que contienen documentos nuevos. El método Open() carga la URL especificada en la misma ventana mientras que el método OpenNew() abre la URL en una nueva ventana. La propiedad HtmlWindow.History contiene un objeto con las URL recientemente visitadas, que son las URL por las que ha navegado el usuario desde la ventana actual, y proporciona métodos para moverse entre esas páginas.
En este ejercico se ha preferido crear un historial propio en vez de mostrarlo desde History porque, a cambio de perder las funcionalidades de dicha propiedad, permite aprender a leer y escribir en un fichero de texto y a cargar dicho fichero en un ComboBox.

Claves del registro de la API de Internet Explorer

Las claves contenidas en

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AboutURLs

especifican el comportamiento del navegador en ciertas circunstancias (página en blanco, navegación cancelada, página no encontrada, etc.):

Inicio del ejercicio

El control WebBrowser está incluido en la caja de herramientas en el apartado Controles Comunes. Para configurar datos de usuario, hay que abrir las propiedades del proyecto y, en la pestaña Settings, añadir nombre, tipo, visibilidad (application o user) y valor asignado. Estos valores permanecen siempre como valores por defecto y, si se desea recuperarlos en tiempo de diseño, sólo hay que pulsar el botón Sincronizar. En este ejercicio se han creado 4 propiedades que guardan el valor en píxeles del tamaño y anchura de la ventana:

User settings

Esto se traduce en código XML que se guarda dentro del proyecto en el archivo Nombre_del_ensamblado.config y más tarde, en tiempo de ejecución, en la configuración del usuario que corresponda, en la carpeta Documents and settings:

<userSettings>
<Navegador_Web.My.MySettings>
<setting name="Anchura" serializeAs="String">
<value>740</value>
</setting>
<setting name="Altura" serializeAs="String">
<value>560</value>
</setting>
<setting name="Izquierda" serializeAs="String">
<value>100</value>
</setting>
<setting name="Derecha" serializeAs="String">
<value>100</value>
</setting>
</Navegador_Web.My.MySettings>
</userSettings>


Se accede a ellas mediante la clase MySettings usando la palabra clave My, es posible asignar su valor a la propiedad de la aplicación que se desea configurar:

'obtener los datos de la configuración guardada al cerrar el formulario por última vez
Me.Width = My.Settings.Anchura
Me.Height = My.Settings.Altura
Me.Left = My.Settings.Izquierda
Me.Top = My.Settings.Derecha
Y también se puede modificar su valor y guardarlo al salir de la aplicación; el método específico que guarda la configuración es ChangeAndPersistSettings() pero también se puede utilizar en su lugar la opción "Save My.Settings on shutdown" de la pestaña Application en las propiedades del proyecto:
Sub ChangeAndPersistSettings()
   My.Settings.Altura = Me.Height
   My.Settings.Anchura = Me.Width
   My.Settings.Izquierda = Me.Left
   My.Settings.Derecha = Me.Top
   '
   'guardar la configuración
   My.Settings.Save()
End Sub

Cargar el ComboBox desde un archivo de texto

Ya se ha dico que para mostrar las páginas visitadas, en vez de recurrir a la propiedad History, el historial se guarda en un archivo de texto que se lee al arrancar la aplicación y desde allí se rellena el ComboBox que hace la función de barra de direcciones (si el archivo de texto no existe, la aplicación arranca con el ComboBox en blanco y, cuando se cierra, se crea el archivo de texto con el historial de las páginas visitadas en la sesión):

'nombre del fichero de texto que guarda los sitios visitados
Private Const FILE_NAME As String = "Historia.txt"
'rellenar ComboBox desde el archivo Historia.txt
'
'variable para cada línea del fichero de texto
Dim line As String
'si el fichero no existe -> no hacer nada (se creará uno al cerrar el programa)
If Not File.Exists(FILE_NAME) Then
   Return
Else
   'StreamReader representa un lector que puede leer una cadena secuencial
   'de caracteres desde un flujo de bytes, contiene al archivo de texto
   Dim sr As StreamReader
   sr = New StreamReader(FILE_NAME)
   '
   'leer las líneas del archivo hasta el final
   Do
     line = sr.ReadLine()
     'si el texto de cbUrl no existe en el ComboBox, añadirlo a la lista
     'pero sólo si la línea no está en blanco
     Dim n As Integer
     'FindString busca en ListBox y ComboBox sin distinguir mayúsculas y minúsculas,
     'si encuentra el elemento buscado, devuelve el índice desde cero del elemento,
     'devuelve -1 si no lo encuentra
     n = cbUrl.FindString(line)
     'una comprobación más de que la línea no está en blanco,
     'sin ella salta un error después de leer la última línea con texto
     ' porque la comprobación en el bucle Do...Loop Until está al final
     If Not line Is Nothing Then
       If (n = -1) Then
         cbUrl.Items.Add(line)
       End If
     End If
   Loop Until line Is Nothing
   '
   'cerrar StreamReader
   sr.Close()
ComboBox con historia

Guardar el ComboBox en un archivo de texto

Al cerrar la aplicación se llama al método guardarArchivo() que vuelca el contenido del Combobox en un archivo de texto de manera que cada ítem de la lista sea una línea del texto:

'guardar el archivo de texto con el historial
    Private Sub guardarArchivo()
            Dim sw As StreamWriter
            If File.Exists(FILE_NAME) Then
                'sobreescribir el texto (no añadir al final)
                sw = New StreamWriter(FILE_NAME, False)
            Else
                'crear un archivo vacío
                sw = File.CreateText(FILE_NAME)
            End If
            Dim i As Integer
            For i = 0 To (cbUrl.Items.Count - 1)
                sw.WriteLine(cbUrl.Items(i))
            Next
            sw.Close()
    End Sub

Añadir el texto de la barra de direcciones al ComboBox

Las distintas URL que van mostrándose en la barra de direcciones se van añadiendo al ComboBox sólo si no están ya incluídas en él; la dirección "about:blank" tampoco se añade a la lista:

Dim n As Integer
            n = cbUrl.FindString(cbUrl.Text)
            If (n = -1) And Not wbHtml.Document.Url.ToString.Equals("about:blank") Then
                cbUrl.Items.Add(cbUrl.Text)
            End If

Método Navegar()

Se crea un método Navegar que comprueba que la barra de direcciones no está en blanco o contiene el texto "about:blank" y usa el método WebBrowser.Navigate para cargar el documento existente en la URL especificada, reemplazando al documento actual:
    Private Sub Navegar(ByVal cadenaUrl As String)
        'comprobaciones sobre la cadena de URL
        If String.IsNullOrEmpty(cadenaUrl) Then Return
        If cadenaUrl.Equals("about:blank") Then Return
        If Not cadenaUrl.StartsWith("http://") And Not cadenaUrl.StartsWith("https://") Then
            cadenaUrl = "http://" & cadenaUrl
        End If
        Try
            'ir a la URL especificada
            wbHtml.Navigate(New Uri(cadenaUrl))
        Catch pollo As System.UriFormatException
            Return
        End Try
    End Sub
De manera que para ir a una URL determinada sólo que hay que llamar a ese método, pasando como parámetro el texto del ComboBox o una cadena con una URL válida:
Navegar("http://www.elguille.info")

Métodos de navegación

Para ir a la página anterior: GoBack
Para ir a la página siguiente: GoForward
Para ir a la página de inicio: GoHome
Para detener la carga de la página: Stop
Para volver a cargar la página. Refresh
Para saber si se puede ir a página anterior o siguiente: CanGoBack y CanGoForward
Para obtener el texto de la barra de estado: StatusText
Para obtener el título del documento: DocumentTitle.ToString

Acerca de...

Visual Studio 2005 permite añadir al proyecto (como un nuevo Windows Form) un cuadro de diálogo "Acerca de..." cuyo código ya prefabricado ahorra mucho trabajo al programador:

Acerca de...

Imagen de la ventana principal del programa


Navegador Web 


Espacios de nombres usados en el código de este artículo:

System
System.Windows.Forms
System.IO


Fichero con el código de ejemplo: miliuco_web.zip - 855 KB


ir al índice principal del Guille