3 de febrero de 2018

Lograr el aspecto cristalino de Vista con Visual FoxPro

Artículo original: Vista’s Aero Glass for Visual FoxPro
http://www.sweetpotatosoftware.com/blog/index.php/2006/10/14/vista-s-aero-glass-for-visual-foxpro/
Autor: Craig Boyd
Traducido por: Ana María Bisbé York


El efecto cristalino

Hubo una pequeña tertulia sobre los formularios transparentes la primera vez que aparecieron, ahora ha alcanzado mayor relevancia con los efectos que brinda Windows vista. En mi opinión, el efecto de apariencia cristalina es el elemento de presentación que marcará a cualquier aplicación como una aplicación que comience a correr en Windows Vista. Por tanto, no es de sorprenderse que muchos desarrolladores están buscando las vías para reproducir un aspecto similar en sus aplicaciones. Bernard Bout tiene algunos ejemplos realmente muy buenos sobre esto en su blog. Con muy buen ojo para el diseño, una pequeña ayuda de Cesar Ch. y GDI+, y teniendo como guía el efecto cristalino de Windows Vista, Bernard me ha impresionado (como consecuencia, lo he agregado a mi lista del Blog). Por favor, vea las siguientes entrada de su blog para que vea sobre qué es de lo que estoy hablando.

Sobre Visual FoxPro en Vista

Crear una aplicación Visual FoxPro que tenga algún efecto Aero Glass es más que suficiente. Los formularios de nivel superior (ShowWindow = 2) están limitados automáticamente (barra de título, caja de controles y bordes) en Aero Glass. Es siempre algo bueno cuando los desarrolladores Visual FoxPro no tienen que saltar hacia lo más novedoso como las golosinas que ofrece Microsoft en un sistema operativo (¿Recuerdan cuando se agregó que VFP soportara los temas?). Esto es especialmente verdadero en este caso porque la alternativa no es muy bonita (vea la imagen debajo de un formulario VFP con ShowWindows = 0 ó 1).

Ha oído sobre esto antes

He oído que muchos de ustedes leyendo esto están pensando, "Craig, usted y los otros han mostrado los efectos cristalinos para formularios Visual FoxPro que se ejecutan en Windows Vista. No hay nada más aquí!". Sin embargo, lo que probablemente no ha visto (no estoy seguro de que se haya hecho antes) es el efecto Aero Glass en el área del cliente (área de superficie) de un formulario VFP y ESO, es lo que voy a mostrar cómo se hace. Vea la siguiente imagen para que vea un ejemplo de lo que estoy diciendo.

¿Cómo está hecho?

Para lograr esto empleé la función DwmExtendFrameIntoClientArea que viene en Desktop Window Manager API (dwmapi.dll) en Windows Vista.

La firma de esta función está declarada como sigue en MSDN:

HRESULT DwmExtendFrameIntoClientArea(
HWND hWnd,
const MARGINS *pMarInset
);

Y la estructura MARGINS (vea el parámetro pMarInset en el código debajo) está definido como sigue:

typedef struct _MARGINS{
int cxLeftWidth;
int cxRightWidth;
int cyTopHeight;
int cyBottomHeight;
} MARGINS, *PMARGINS

Que yo traduje en la siguiente declaración y código que agregué al Init() de un formulario de nivel superior en Visual FoxPro 9.0 que corre en Windows Vista.

DECLARE LONG DwmExtendFrameIntoClientArea IN dwmapi.dll Long hwnd, string @ pMarInset

LOCAL lnHwnd, lcMargin, lnGlassLeft, lnGlassRight, lnGlassTop, lnGlassBottom

m.lnHwnd = this.HWnd
m.lnGlassLeft = 50
m.lnGlassRight = 50
m.lnGlassTop = 50
m.lnGlassBottom = 50
m.lcMargin = BINTOC(m.lnGlassLeft, '4RS') ;
           + BINTOC(m.lnGlassRight, '4RS') ;
           + BINTOC(m.lnGlassTop, '4RS') ;
           + BINTOC(m.lnGlassBottom, '4RS')

DwmExtendFrameIntoClientArea(m.lnHwnd, @m.lcMargin)

Este código no tuvo ningún efecto en mi formulario de nivel superior, así que supe que aún estaba olvidando una pieza de mi rompecabezas. La respuesta vino de un artículo de Code Project. Se ve para la función DwmExtendFrameIntoClientArea que trabaje su magia en píxeles que son cambiados como parte del frame Aero Glass pueden hacer que el canal Alpha sea 0. Y con este artículo descubrí la vía más sencilla para pintar esos píxeles negros.

Entonces, lo que hice fue, en lugar de hacer un gancho a los mensajes de Windows y utilizar GDI+ para hacer esto (que hubiera podido) utilicé algunas formas VFP con su propiedad BackColor como RGB(0,0,0). Coloqué cuatro de estas formas alrededor de los lados del formulario y les arreglé su altura y ancho (dependiendo de dónde fueran colocadas). Empasté los valores que había asignado a m.lnGlassLeft, m.lnGlassRight, m.lnGlassTop, y m.lnGlassBottom (vea el código debajo donde yo imito una estructura MARGINS (márgenes). Una vez que hice esto, el formulario se vio como se muestra en la imagen en el diseñador de formularios de VFP. Y, cuando lo ejecuté, voila' - ¡ ya tengo el efecto Aero Glass en el área de cliente de un formulario VFP!

¿Y esto para qué es bueno?

Hay muy buenos ejemplos de Interfaz de usuario que han sido diseñadas utilizando esta técnica. Puede ver algunas de ellas si visita el artículo de Code Project que he indicado antes en esta entrada de blog. En pocas palabras, esto es bueno para la creación de magníficas interfaces de usuario para aplicaciones Visual FoxPro.

Un buen uso podría ser crear áreas de barra de estado en formularios de nivel superior que incluyan una barra de progreso y otros controles. La imagen que está debajo es solamente un ejemplo de cómo suena esto en un formulario VFP. Emplea el mismo código que he mostrado arriba excepto que solamente fijo lnGlassBottom en 50 (todo el resto fue 0) y solamente he utilizado la forma con el BackColor en negro.

Más trabajo por hacer

Esta prueba de concepto no completa lo que necesitamos algunas clases / controles VFP ya que tendríamos algunos problemas al colocarlas en el área de cliente que sea generado con un fondo cristalino. Esto se debe, como puede imaginar, que todo lo que sea negro (como ForeColor y BackColor) será generado como traslúcido. Un par de soluciones sobre este tema son emplear controles ActiveX o clases de Windows como hice en el formulario anterior con el control Microsoft ProgressBar Control, versión 5.0 (SP2). La otra vía podría ger generar los elementos gráficos empleando GDI+ y en este respecto _gdiplus.scx que viene con Visual FoxPro 9.0 y el proyecto GDIPlus en VFPX vendrá definitivamente integrado. En cualquier evento, es muy fácil conocer que este tipo de efecto Aero Glass es realmente posible de hacer en Visual FoxPro 9.0. Me ha sorprendido gratamente encontrar que es sencillo de implementar.

Hasta la próxima ... ¡Visual FoxPro es genial!

No hay comentarios. :

Publicar un comentario

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.