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
PowerBuilder 2025 (FrontEnd): github.com/rasanfe/PersonDemo03
API creada con SnapDevelop 2025 en .Net 8 (BackEnd): github.com/rasanfe/MyPowerServer
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
Publicar un comentario