Navegador web en VB (2)

Navegador Web usando la clase WebBrowser, configurando 2 idiomas diferentes (es-ES y en-US) que se guardan en My.Settings, cambiando de idioma sin reiniciar la aplicación, mostrando el código HTML de la página que se visita en un segundo formulario y almacenando el historial en un archivo de texto entre sesiones, en Visual Studio 2017

Continuando el ejercicio anterior (aquí) se completa con las propuestas de localización e internacionalización del programa. Se añade un formulario de opciones que permite configurar el programa, tanto en lo que respecta al arranque en ventana o pantalla completa como a la hora de cambiar el idioma utilizado (restringido a 2: español e inglés). También se añade un formulario que muestra el código HTML de la página web que se está visitando.

Añadiendo el formulario de opciones

Siempre resulta más cómodo que los programas tengan un formulario centralizado en el que poder modificar sus parámetros. En este ejercicio se consigue mediante un formulario de tipo modal (diálogo) que permite al usuario seleccionar entre varias opciones o realizar alguna acción:

  • elegir el modo de inicio de la aplicación: ventana o pantalla completa
  • elegir el idioma de la interfaz (castellano o inglés)
  • registrar la aplicación en la lista de aplicaciones y navegadores.

Al cambiar la elección del idioma, ha de modificarse en todos los formularios de la aplicación incluido por supuesto el de opciones. Como ejemplo, éste es el formulario de opciones cuando la interfaz está en inglés (al inicio del artículo se muestra el mismo formulario con la interfaz en castellano):

Cambio de idioma

El cambio instantáneo del idioma de la interfaz se puede conseguir fácilmente mediante la propiedad CurrentCulture del hilo actual, como en este código:

'al cambiar el ítem seleccionado en el comboBox
Private Sub CbIdiomas_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CbIdiomas.SelectedIndexChanged
'elegir idioma en el ComboBox
	Select Case CbIdiomas.SelectedIndex
	    'el ítem 1 (índice 0) es "Español (España)"
	    Case 0
		Form1.lengua = "es-ES"
	    Case 1
		'el ítem 2 (índice 1) es "Inglés (Estados Unidos)"
		Form1.lengua = "en-US"
	End Select
	My.Settings.Cultura = Form1.lengua
	'
	'Cambiar de idioma sobre la marcha
	'renovar los controles del formulario principal
	Call Form1.cambiarIdioma()
	'texto visible del ComboBox, diferente según la cultura
	Select Case Form1.lengua.Substring(0, 2).ToLower()
	    Case "es"
		CbIdiomas.Text = "Idiomas disponibles:"
	    Case Else
		CbIdiomas.Text = "Available languages:"
	End Select
	'cerrar este formulario Configuración
	Me.Close()
End Sub

Hay que traducir los cuadros de diálogo o cualquier otro elemento cuyo aspecto dependa de la cultura actual.

'mensaje después de la operación, diferente según la cultura
    Select Case Form1.lengua.Substring(0, 2).ToLower()
	Case "es"
	    MsgBox("Operación completada correctamente.", MsgBoxStyle.Information, "Info")
	Case Else
	    MsgBox("Operation succesfully completed.", MsgBoxStyle.Information, "Info")
    End Select

Para cambiar el idioma de la interfaz sin reiniciar la aplicación es necesario cambiar la propiedad CurrentCulture del hilo actual y volver a recrear el formulario y todos sus controles (en caso de no hacerlo así, nos encontraríamos con controles duplicados, uno por cada idioma, conservaríamos los del idioma anterior y aparecerían los del idioma recién seleccionado).

'ADOPTAR EL IDIOMA SELECCIONADO EN EL FORMULARIO DE OPCIONES Y RECREAR
'EL FORMULARIO Y SUS CONTROLES PARA QUE SE MUESTREN EN EL IDIOMA CORRECTO
Shared Sub CambiarIdioma()
	My.Settings.urlIdioma = Form1.WbHtml.Url.ToString
	'aplicar el idioma seleccionado en CbIdiomas al hilo actual del programa
	Thread.CurrentThread.CurrentCulture = New CultureInfo(lengua)
	Thread.CurrentThread.CurrentUICulture = New CultureInfo(lengua)
	'
	'recrear el formulario y sus controles para que se muestren en el idioma correcto
	Form1.Controls.Clear()
	Form1.InitializeComponent()
	Form1.Navegar(My.Settings.urlIdioma)
End Sub

Formulario que muestra el código HTML

Desde el menú «HTML de la página» del formulario principal se abre otro formulario llamado codeFrom.vb que está ocupado por un control RichTextBox encargado de mostrar el código HTML de la página que se está visitando. Este nuevo formulario se abre dentro de la ventana del formulario principal obteniendo desde Form1 posición y dimensiones para reducirlas en un pequeño número de píxeles.

'colocar este formulario dentro de la ventana del formulario principal Form1
Me.Top = Form1.Top + 20
Me.Left = Form1.Left + 20
Me.Width = Form1.Width - 40
Me.Height = Form1.Height - 40

Se rellena el control RichTextBox con el texto HTML de la página web y las 2 etiquetas con el título de la página y el nº de líneas de código.

Dim s, u As String
Dim n As Integer
s = My.Forms.Form1.WbHtml.DocumentText 'el texto html de la página web
u = My.Forms.Form1.WbHtml.Document.Url.ToString 'el título de la página web
If s.Length > 0 Then
    RtBox.Text = s 'rellenar RichTextBox
    n = RtBox.Lines.Length
    Lb1.Text += " " + u 'título de la página
    Lb2.Text += " " + n 'nº de líneas del texto html
End If

Un menú contextual ContextMenuStrip y objetos ToolStripMenuItem proporcionan funcionalidad de seleccionar y copiar texto y también cerrar el formulario.

'el objeto MnContext (ContextMenuStrip) del RichTextBox habilita el menú contextual 
'con las opciones Seleccionar todo, Copiar y Cerrar la ventana y aparte de ello sigue 
'estando disponible la opción de copiar y pegar texto con teclado Ctrl+A Ctrl+C Ctrl+V
Private Sub MnSeleccionar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MnSeleccionar.Click
	RtBox.SelectAll()
	RtBox.SelectionStart = 0
	RtBox.SelectionLength = RtBox.Text.Length
	RtBox.Focus()
End Sub

'copiar al portapapeles el texto seleccionado
Private Sub MnCopiar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MnCopiar.Click
	RtBox.Copy()
End Sub

Control WebBrowser y versión del navegador

El control WebBroser de .NET Framework no incorpora su propio navegador sino que se limita a interactuar, en teoría, con la versión de Internet Explorer que tengamos instalada en el sistema. En la práctica da la impresión de corresponderse con las características de la versión 7. Para forzar al control a usar las características de la versión 11 que es la más alta a la que ha llegado es necesario modificar la clave del registro que configura el modo de emulación del navegador:

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]

Añadiendo el nombre de la aplicación (por ejemplo, emiWeb.exe en este ejemplo) y como valor dword el número 00002af9 que corresponde a la versión 11. Esto funciona para aplicaciones independientes pero cuando la estamos ejecutando desde dentro de Visual Studio hay que añadir otra clave con el nombre de la aplicación intercalando vshost de esta forma emiWeb.vshost.exe y dando el mismo valor dword 00002af9. Sería equivalente a ejecutar un archivo con extensión .reg y este contenido:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"emiWeb.exe"=dword:00002af9
"emiWeb.vshost.exe"=dword:00002af9

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"emiWeb.exe"=dword:00002af9
"emiWeb.vshost.exe"=dword:00002af9

Pero si deseas tener una aplicación con la funcionalidad de navegación web moderna similar a la de Microsoft Edge o las versiones actuales de Chrome, Firefox, Safari… has de recurrir a otras herramientas (EOWebBroser, CefSharp, Awesomium, GeckoFx, Mono WebBrowser, DotNetBrowser, etc.).

Aunque la opción más sencilla de implementar desde Visual Studio es el control WebView que podemos considerar sucesor de WebBrowser y que está disponible en el paquete Microsoft.Toolkit.Win32.UI.Controls.

Aplicación completa en Visual Studio 2017: emiweb

<< Primera parte

Deja un comentario

Tu dirección de correo electrónico no será publicada.