| Artículos | 01 NOV 1996

Salvapantallas en Delphi

Tags: Histórico
Genera gráficos, animaciones o similares
Jaime Peña.

En una anterior oportunidad, habíamos tratado el tema de los salvapantallas (véase PC World nº 104 de noviembre de 1994). En ese artículo nos basábamos en el lenguaje C (con el compilador Microsoft Visual C++) y en la biblioteca estándar de Microsoft SCRNSAVE.LIB y el archivo de cabecera SCRNSAVE.H, que facilitan sustancialmente la programación de este tipo de aplicaciones Windows.

Borland Delphi es capaz de abarcar todos los aspectos de la programación bajo Windows, desde aplicaciones simples, generadas mediante técnicas RAD (Rapid Application Development), hasta programación a bajo nivel, pasando por gestión de bases de datos, accesos a Inter e Intranet, automatizaciones OLE y aplicaciones cliente/servidor. Dentro de este espectro, los salvapantallas no son una excepción y aunque no se dispone de una biblioteca específica (como sí la hay para el lenguaje C), dispondremos de todos los elementos necesarios para desarrollarlos.

Visión general de un salvapantallas

Un salvapantallas es una aplicación Windows con ciertas peculiaridades. No confunda su extensión habitual .SCR, es realmente un ejecutable .EXE común, en cuanto a código interno, que se renombra como .SCR y se incluye en el directorio de Windows o en su subdirectorio SYSTEM, para hacerlo accesible al gestor de salvapantallas de Windows. Las peculiaridades a las que nos referimos van por otro lado: se adueña de todas las entradas por teclado y ratón, ocupa toda la pantalla, poniéndola fundamentalmente en negro, consta de una animación más o menos aleatoria y, normalmente, se finaliza al introducir una clave.

Gran parte de las operaciones que podrían ser más complejas, como el lanzamiento temporalizado del salvapantallas, tras un período de inactividad del ordenador, las realiza ya Windows. Por tanto, sólo hemos de preocuparnos de las interioridades de la aplicación, no de cómo hacer que emerja en nuestro ordenador. Más exactamente, un salvapantallas tiene la siguiente estructura:

- Una ventana maximizada (ocupa toda la pantalla), que dispone de un fondo negro, sin barra de título, ni barras de menús, estado, desplazamiento, etc.

- Debe adecuarse al tamaño de la pantalla. Esto es, no vale con fijar un tamaño estándar de 640x480. En tiempo de ejecución, durante su activación, detectará el modo de vídeo y se expandirá hasta ocupar la totalidad del espacio visible.

- Un salvapantallas suele exponer un mensaje o gráfico dinámico en pantalla, de manera que no esté permanentemente iluminada ninguna parte fija. El ideal es que no esté ninguna parte durante un período dilatado y que sea una figura que consuma poco; sólo consideraciones estéticas fuerzan a algunos a tener sofisticados elementos gráficos en movimiento.

- Para desactivar un salvapantallas, deberemos considerar la posibilidad de protegerlo con una contraseña.

- Definir la contraseña, que puede estar encriptada, la velocidad de animación, etc., se realizará mediante una caja de diálogo de configuración.

- Puede ser una buena idea definir un tiempo máximo para entrar la contraseña. Así se evita que, accidentalmente, se active su caja de diálogo y quede así por tiempo indefinido.

- No es nada extraño que un sistema de control de accesos tenga asociado un salvapantallas; pero un salvapantallas no es esencialmente eso. Debe servir para proteger componentes hardware durante períodos de inactividad. Diséñelo siempre con esta premisa como punto esencial.

- No debemos preocuparnos por temporalizar el período de latencia antes de su activación. Eso se realiza automáticamente por parte de Windows, cuando seleccionamos un salvapantallas concreto.

Diseño del formulario

Un formulario que sirva de base para la ventana principal del salvapantallas, ha de tener algunas propiedades específicas y, durante su creación, hemos de tomar algunos datos acerca del entorno (fundamentalmente, medidas de la dimensión de la ventana). Tomando como base los listados de la Figura 1 y la Figura 2, comentaremos seguidamente aquellos puntos mas relevantes.

En lo referente a sus propiedades, véase el listado de la Figura 2, nos interesa especialmente la propiedad Border. Se debe especificar del tipo bsNone por dos motivos: obviamente sería contradictorio presentar una barra de título, con sus iconos, y, por otra parte, el propio evento de exposición de esos elementos deshabilitaría el salvapantallas. Pruebe, por ejemplo, a fijar un tipo de borde bsSingle o bsSizeable.

Un segundo aspecto esencial es el color de fondo del área cliente. Escoja en la propiedad Color un tipo clBlack, de manera que el fondo de la ventana y, por ende, de toda la pantalla sea negro (sin iluminación propia). También cabría cambiar esta propiedad en tiempo de ejecución, con una orden del tipo:

Form1.Color := clBlack;

en el procedimiento de evento OnCreate. Normalmente, la función se denominará automáticamente TForm1.FormCreate (véase el listado de la Figura 1).

La propiedad FormStyle es un tanto particular. A primera vista, sería recomendable fijarla con el valor fsStayOnTop. Eso implica que la ventana del salvapantallas se situaría en la cima de la pila de ventanas abiertas. La cuestión no es desacertada es, simplemente, incompleta si deseamos poder exponer un diálogo de entrada de contraseñas para deshabilitar el salvapantallas. mejor dejarla con el valor fsNormal y poner la ventana del salvapantallas en la cima de ventanas dinámicamente, llamando a la función OnTop (ver listado de la Figura 1). Cuando deseamos exponer el diálogo de contraseñas o salir del salvapantallas, llamaremos a esta función con el parámetro FALSE.

Dado que las dimensiones de la pantalla pueden variar, hemos de detectarlas en el momento de cargar el salvapantallas y, en consecuencia, redimensionar el área cliente del formulario. Observe en el listado de la Figura 1 el procedimiento TForm1.FormCreate, en donde las propiedades Height y Width se ajustan en tiempo de ejecución, dinámicamente, al alto y ancho de la pantalla, pasando por alto los valores definidos en el inspector de objetos, en el que los valores dados son irrelevantes:

Height := Screen.Height;

Width := Screen.Width;

Trata de fijar estos valores con, por ejemplo 768 y 1024, en el momento del diseño, nos llevaría a atestar el entorno de diseño y a no saber exactamente con que área disponemos para ejecutar funciones de dibujo del salvapantallas.

Funciones específicas

Hay varias funciones que son peculiares de un salvapantallas. Algunas se refieren a cómo plantear su comportamiento, otras se relacionan con la captura de los eventos enviados por el ratón y el teclado, ya que son los que nos permitirán desactivar el salvapantallas.

Respecto a las funciones propias del funcionamiento de un salvapantallas, nuevamente nos remitimos al listado de la Figura 1, especialmente nos interesa FormCreate. Primero, especificamos las cotas del formulario (0, 0) y sus dimensiones (ancho y alto), estas últimas en función de las dimensiones de la pantalla. Luego, se toma la posición del cursor del ratón, de manera que tengamos referencia exacta de su desplazamiento y así saber en la función OnMouseMove si activar la salida del salvapantallas.

Después, se indica el texto dinámico que aparecerá en el salvapantallas (esto podría no ser así, si es que el salvapantallas no expusiera textos en pantalla). A la vez, se indica que inicialmente el texto esté en las cotas (0, 0), posteriormente (véase más abajo), cambiaremos su posición mediante un temporalizador (timer).

Finalmente, se realizan varias llamadas a funciones específicas de un salvapantallas:

OnTop(TRUE);

CursorOff;

...

Application.OnIdle := AppIdle;

Application.OnMessage := AppMessage;

Application.OnDeactivate := AppDeactivate;

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información