Imagen de Fondo en Ventana MDI con TabbedView Control

PowerBuilder ha evolucionado mucho en sus últimas versiones, y con la introducción del TabbedView Control en ventanas MDI, el área del cliente (el clásico mdi_1) se gestiona de forma distinta. Este cambio ha hecho que algunos desarrolladores se pregunten: ¿cómo puedo mostrar una imagen de fondo cuando uso TabbedView?

La respuesta corta es: no se puede mostrar un fondo permanente detrás de todas las hojas cuando TabbedView está activo. Sin embargo, existe una solución elegante para mostrar un logo o imagen de fondo solo cuando no hay ventanas abiertas. Esta técnica está basada en una idea compartida por John Fauss en la comunidad de Appeon, a la que he añadido mi propia implementación usando un objeto visual con WebBrowser.

¿Qué hace esta solución?

  • Muestra una imagen centrada y adaptativa en el área MDI cuando no hay hojas abiertas.
  • Oculta automáticamente la imagen cuando se abre una ventana.
  • La vuelve a mostrar cuando se cierra la última hoja.
  • La imagen se adapta visualmente al tema activo (colores, fondo).
  • Todo esto se realiza sin usar imágenes incrustadas, sino cargadas desde una URL.

El Objeto Visual: u_web_background

He creado un UserObject visual llamado u_web_background, que contiene un control WebBrowser. En el evento Constructor, genero el HTML de una página muy simple que:

  • Centra una imagen cargada por URL (<img src="...">)
  • Ajusta el fondo según el tema activo (GetTheme())
  • Desactiva el clic derecho
  • Aplica estilos adaptativos y modernos

Fragmento del evento Constructor:

ls_ruta = "https://www.rsrsystem.com/imagenes/person_demo_logo.png"
ls_themename = GetTheme()
// Colores según tema
CHOOSE CASE ls_themename
   CASE "Flat Design Blue"
      ls_color_fondo="#bfbfbf"
// ...
END CHOOSE

ls_html = "<!DOCTYPE html>" + "~r~n"+&
				"<html>" + "~r~n"+&
				"<head>" + "~r~n"+&
				"  <meta charset="+Char(34)+"UTF-8"+Char(34)+">" + "~r~n"+&
				"  <title>RSRSYSTEM</title>" + ...
wb_1.NavigateToString(ls_html)

En el evento NavigationCompleted, activo la visibilidad del objeto una vez que la imagen se ha cargado.

Integración en la Ventana MDI (w_frame)

1. Declarar el objeto de fondo:

u_web_background iuo_web

2. En el evento Open de w_frame:

// Cargamos fondo MDI
This.OpenUserObject(iuo_web, "u_web_background")
iuo_web.Move(0, This.rbb_main.height + 10)
iuo_web.Resize(This.WorkSpaceWidth(), This.WorkSpaceHeight() - This.rbb_main.height - 75)

3. En el evento Resize:

If IsValid(iuo_web) Then
   iuo_web.Move(0, This.rbb_main.height + 10)
   iuo_web.Resize(This.WorkSpaceWidth(), This.WorkSpaceHeight() - This.rbb_main.height - 75)
End If

Gestión desde las Venatanas (abiertas con OpenSheet)

En el evento Open de la Ventana:

If IsValid(w_frame) Then
   w_frame.iuo_web.Post of_set_visible(False)
End If

En el evento Close de la Ventana:

Long ll_OpenWindows

If IsValid(w_frame) Then
   ll_OpenWindows = gf_ventanas_abiertas(w_frame)
   If ll_OpenWindows = 1 Then
      w_frame.iuo_web.Post of_set_visible(True)
   End If
End If

Función gf_ventanas_abiertas:

global function integer gf_ventanas_abiertas (w_frame aw_main)
Integer li_Count
window lw_Sheet

lw_Sheet = aw_main.GetFirstSheet()
If IsValid(lw_Sheet) Then
   Do
      li_Count += 1
      lw_Sheet = aw_main.GetNextSheet(lw_Sheet)
   Loop While IsValid(lw_Sheet)
End If
Return li_Count

Resultado Visual

Cuando no hay hojas abiertas, se muestra el logo centrado en un fondo que se adapta al tema de PowerBuilder. Al abrir una hoja, el logo desaparece, dejando el espacio completamente funcional para tus ventanas. Cuando se cierra la última hoja, el logo reaparece automáticamente.

Recomendaciones

  • Si trabajas con herencia, basta con añadir este comportamiento en la ventana base w_ancestor.
  • Puedes usar esta técnica para mostrar contenido dinámico (noticias, avisos internos, enlaces, etc.).

Enlaces y Descargas


Os recuerdo que lo podeis decargar: 

Conclusión

Esta técnica permite dar un toque más profesional y visualmente agradable a tus aplicaciones MDI con TabbedView. Aunque PowerBuilder no permite aún mostrar un fondo permanente en modo tabulado, esta alternativa cumple perfectamente su función cuando no hay hojas abiertas.

¡Nos vemos en el próximo artículo!

Y recuerda:

En PowerBuilder, los límites solo están en nuestra imaginación. 🚀

Comentarios