[vfp] Porque no funcionan las transparencias del png en los botones

1,575 views
Skip to first unread message

ZeRoberto

unread,
Feb 8, 2013, 2:24:36 PM2/8/13
to publicesvfoxpro
Porque no funcionan las transparencias de una imagen png en los botones? en un control image funciona a la prefeccion.

Saludos

Richard Gaviria

unread,
Feb 8, 2013, 2:55:33 PM2/8/13
to publice...@googlegroups.com
Tienes instalado el SP2 de VFP 9?

Saludos

Rick.

 



Date: Fri, 8 Feb 2013 14:24:36 -0500
Subject: [vfp] Porque no funcionan las transparencias del png en los botones
From: zero...@gmail.com
To: publice...@googlegroups.com

Edgar Acevedo

unread,
Feb 8, 2013, 2:59:52 PM2/8/13
to publice...@googlegroups.com
Yo nunca pude saber porqué.  No me quedó mas alternativa que convertirlos a BMP y allí si me trabajaron bien.  Si alguien te responde acertadamante por fin también desvelaré ese misterio...

Salu2,


Edgar

Hugo C.

unread,
Feb 8, 2013, 6:02:29 PM2/8/13
to publice...@googlegroups.com

ZeRoberto

unread,
Feb 8, 2013, 9:06:46 PM2/8/13
to publice...@googlegroups.com
Gracias Hugo por el enlace pero por que el google no lo puede traducir.?

Saludos

Hugo C.

unread,
Feb 8, 2013, 11:14:08 PM2/8/13
to publice...@googlegroups.com

Que extraño, aquí  esta la traducción de Google. 

Saludos.

Bitmaps superpuestos en FoxPro siempre han sido un dolor real, pero con el fin de hacer una interfaz de usuario que se ve limpio, conseguir algún tipo de transparencia para trabajar con controles de FoxPro es muy importante. Aunque FoxPro admite los formatos de imagen más comunes, incluyendo GIF y PNG que soporta transparencia, la transparencia no es soportado por todas partes dentro del producto.

En concreto, el control Image FoxPro admite la transparencia de los formatos de imagen transparentes distintos. Si se carga hasta un control de imagen con un archivo GIF o PNG, la transparencia se conserva y la imagen se visualice correctamente.

Sin embargo, la visualización de imágenes transparentes en otros controles que tienen una propiedad de imagen, por desgracia, no funciona tan bien. En concreto, he aquí un ejemplo de lo que he estado luchando con, que es botones con iconos asociados:

ataleoftwobuttons [6] 

El primer botón no muestra transparencia y se ve terrible, mientras que el segundo botón muestra correctamente transparencia y aparece como tiene que utilizar uno de los métodos mencionados a continuación. Una situación similar se presenta con otros controles que tienen propiedades de la imagen, como OptionButton, casillas de verificación. ComboBoxes y cuadros de lista también, aunque es menos de un problema allí porque el fondo de las listas tienden a ser de color blanco. Como cuestión de hecho, todos los controles contenedores tienen una propiedad de imagen y aplicar las mismas reglas.

Por defecto, sólo el control de imagen soporta transparencia adecuada para todos los formatos de imagen de GDI +.

La buena noticia es que con un poco de astucia puedes conseguir FoxPro para representar imágenes transparentes. La mala noticia es que hay soluciones de compromiso y el trabajo extra que se requiere para que funcione correctamente.

Old School soporte para transparencia: BMP de imagen

GDI + para soporte de imágenes sin imágenes BMP en realidad es una característica relativamente nueva en FoxPro. GDI + soporte para gráficos se introdujo con Visual FoxPro 8. Antes de la versión 8 sólo imágenes BMP fueron apoyados directamente en el producto y hay un par de los mecanismos utilizados para la manipulación de transparencia con BMPs.

La forma más confiable de obtener transparencia en FoxPro implica el uso de archivos BMP y una correspondencia de archivos BMP Mask . El archivo de máscara básicamente tiene puntos negros para cada uno de los píxeles que debe mostrar y contenidos blanco para cualquier cosa que debe ser transparente. Como se puede imaginar la creación de archivos de máscara es un dolor y agrega el desorden a su gestión de la imagen - en cualquier momento la imagen cambia la máscara tiene que ser cambiado demasiado y mantener las cosas en sincronía es terrible. Para mí esto siempre ha sido un non-starter.

También puede obtener soporte de transparencia con sólo imágenes BMP. Por defecto, las imágenes BMP mostrar píxeles blancos como transparente, por lo que mientras usted fácilmente puede representar su contenido transparente de color blanco que es fácil de hacer. Esto no siempre es tan corta y seca sin embargo porque "contenido" de la imagen también pueden contener píxeles blancos.En este caso, usted puede llenar los píxeles blancos con un color blanco ligeramente desviado como RGB (254,254,254).

Ambos de estos métodos son dolorosos, pero son muy fiables. Una vez que tienes la imagen creada que siempre funciona sin falta. Sin embargo, ambos enfoques requieren que por lo menos convertirlos a formato BMP y potencialmente modificar sus imágenes para la transparencia o la creación de una máscara.

Recurso de carga en FoxPro

Hay otro método que funciona en la mayoría de situaciones, debido a una peculiaridad en FoxPro que me acabo de enterar de la semana pasada. FoxPro carga las imágenes como recursos y se puede engañar a FoxPro mediante la carga de imágenes con transparencia por primera vez que los carga en un control Image que como se mencionó anteriormente no admiten transparencia. El truco es que tienes que cargar la imagen en el control de la imagen antes de que se cargan en una propiedad de imagen de otro control. La peculiaridad es que FoxPro almacena en caché datos de la imagen, una vez cargados desde un camino, por lo que la carga en un control de imagen en caché la primera imagen transparente que luego se carga en las cargas subsiguientes que hacen referencia a la misma imagen de disco (o compilada en recurso de imagen).

El control de imagen que sólo se ha cargado y el control puede ser puesto en libertad. La clave es que este "pre-carga" tiene que ocurrir antes de cargar la misma imagen en otros controles. El control de la imagen no tiene por qué quedarse, así que uso una pequeña función que sólo necesita pasar una ruta de archivo, crear el control Image y establezca la propiedad imagen:

************************************************** **********************
* LoadImageResource
****************************************
Función ***: Pre-cargar un archivo de imagen de modo que la transparencia es respetado
Supongamos ***:
*** Pasar:
*** Regreso:
************************************************** **********************
FUNCIÓN LoadImageResource ( lcFile )
 LOCAL loImg como imagen
 loImg = CREATEOBJECT ( "Imagen" )
 loImg . Picture = FULLPATH ( "BMP \ search_small.png" )
 ENDFUNC
 * LoadImageResource

Cuando se cierra la función de control de la imagen está en libertad, pero ya que la imagen se ha cargado con eficacia en el control de la imagen está ahora dentro de la caché de imágenes en caché de VFP. Ahora bien, cuando se carga una imagen que ha sido llamado con la función en una propiedad de imagen de otro control como un botón, se mostrará GIF y PNG transparencia adecuada.

En una aplicación que tienden a tener un buen número de recursos de imagen pocas que tengo que cargar, así centralizar un lugar cuando lo hago toda la imagen pre-carga durante el inicio. Puedo crear una función que yo llamo de inicio de la aplicación, por lo general justo después de mostrar una pantalla de inicio.

El método es simplemente un conglomerado de llamadas LoadImageResource ():

************************************************** **********************
* LoadImageResources
****************************************
Función ***: método se utiliza para cargar imágenes transparentes en
*** IU. Este método debe ser llamado en el arranque
Supongamos ***:
*** Pasar:
*** Regreso:
************************************************** **********************
FUNCIÓN LoadImageResources ()
 LOCAL loImg como imagen

LoadImageResource ( "BMP \ search_small.png" )
 LoadImageResource ( "BMP \ zipfile.gif" )
 ...
 ENDFUNC
 * LoadPictureResources

Este es un enfoque simple que funciona muy bien y permite el uso de imágenes PNG y GIF con transparencia en los botones y otros controles.

Advertencias con precarga

En algunos casos, no obstante usted puede terminar con la falta de transparencia los recursos. Básicamente FoxPro almacena en caché los recursos internos, pero hay varias maneras de que los recursos puedan llegar sin caché. Explícitamente, si el código llama al comando CLEAR RESOURCES cualquier lugar, los recursos se liberan y perderá todos los recursos almacenados en caché en ese punto. Si nos remontamos a un formulario con una imagen transparente en un control de la imagen se mostrará de nuevo con fondo opaco. Tenga en cuenta que los recursos CLEAR no se ve afectada por comandos como CLEAR ALL o RELEASE ALL.

Implícitamente, FoxPro puede en ciertas ocasiones también descargar sus recursos de imágenes internamente cuando la memoria es realmente bajo. Esto debe ser muy raro, pero es posible y he visto ocasiones en que esto ocurre. Pero es muy raro, así que es probable que en Aceptar para ignorar esa posibilidad. Si usted está preocupado acerca de este escenario que puede tener algún código que llama a LoadImageResources () o algo por el estilo durante ciertos puntos clave de la aplicación que el fuego de vez en cuando para forzar explícitamente carga de las imágenes, o puede cargar recursos según sea necesario cada vez que una forma dada se puso en marcha. Esto asegurará que los recursos son siempre frescos, pero ten en cuenta que esto causa cierta sobrecarga adicional.

Resumen

Honestamente, quisiera que esto era más fácil de lograr o más obvio. Durante mucho tiempo yo ni siquiera sabía que este hack de imagen de carga previa. La solución más segura es usar archivos BMP, pero sin duda es mucho más cómodo de usar archivos Web listos como PNG o GIF que apoyan la transparencia tanto para el diseño de los iconos y los re-utilizando todas las aplicaciones y plataformas (Web / Escritorio como yo).

El tener que pre-carga de recursos para imágenes transparentes de esta manera es una gran molestia en lugar de sólo carga los recursos de imagen directamente. Y lo peor es que es un hack feo que es imposible de descubrir por su cuenta. He encontrado una vaga referencia a esto en un mensaje de los foros en alguna parte, así que es incluso difícil de buscar. Espero que este blog te ayudará clarfiy el tema un poco mejor, incluso si es sólo para mí recordar en el futuro.

¿Qué es una mierda acerca de este problema es el hecho de que hace obras con recursos de imágenes precargadas. Esto parece sugerir que la transparencia realmente funciona en los controles, pero hay un pequeño detalle de implementación en Visual FoxPro que impide que esto trabajando todo el tiempo. Al parecer, esto habría sido una cosa menor para el equipo de Fox para arreglar y empezaremos a trabajar fuera de la caja, si los recursos para hacerlo había estado allí. Pero, por desgracia, nos quedamos con un hacks de menor importancia y inhallable. Doy un hachazo sobre el mismo no funciona en absoluto, que era lo que yo pensaba hasta hace una semana.

Gracias a Cesar Chalom , Joel Leach , Dragan Nedeljkovich para proporcionar algunas ideas para este post y Mike Lewis para proporcionar la inspiración para profundizar en ello y sacarme a una solución de trabajo en el Generador de Ayuda HTML .

ZeRoberto

unread,
Feb 9, 2013, 1:21:36 PM2/9/13
to publice...@googlegroups.com
Gracias Hugo C. el truco esta perfecto, funciona bien

Saludos

Allan Raúl Acuña

unread,
Feb 9, 2013, 6:46:17 AM2/9/13
to publice...@googlegroups.com
Prepara un ejemplo y compártelo.
 
Saludos
 
Allan R. Acuña

ZeRoberto

unread,
Feb 9, 2013, 1:47:38 PM2/9/13
to publice...@googlegroups.com
Ok, algún otro pedido mas? XD

Saludos

Hugo C.

unread,
Feb 9, 2013, 5:04:07 PM2/9/13
to publice...@googlegroups.com
Que bueno que resulto.

Saludos.

ZeRoberto

unread,
Feb 8, 2013, 2:56:05 PM2/8/13
to publice...@googlegroups.com
Si

2013/2/8 Richard Gaviria <rgav...@msn.com>
Reply all
Reply to author
Forward
0 new messages