Página 1 de 1

PNG en TAB

Publicado: 15 Abr 2012, 23:47
por avechuche
Bueno vengo con otra duda. Quiero insertar varios ".png" en un tab, encontre en el foro ingles dos maneras diferentes, las dos andan, pero no andan.

La primera que encontre es esta.

Código: Seleccionar todo

#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>

Opt("MustDeclareVars", 1)

; ===============================================================================================================================
; Global variables
; ===============================================================================================================================
Global $hGUI, $hImage, $hGraphic

; Create GUI
$hGUI = GUICreate("Show PNG", 240, 240)
GUISetState()

; Load PNG image
_GDIPlus_StartUp()
$hImage   = _GDIPlus_ImageLoadFromFile(StringReplace(@AutoItExe, "autoit3.exe", "Examples\GUI\Torus.png"))

; Draw PNG image
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)

; Loop until user exits
do
until GUIGetMsg() = $GUI_EVENT_CLOSE

; Clean up resources
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_ShutDown()
Este anda, pero no lo puedo insertar en un TAB (o no se como hacerlo), porque por lo que entiendo "dibuja" el ".png" después que muestra el GUI.

Después encontre este

Código: Seleccionar todo

#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>

Global Const $IMAGE_BITMAP = 0
Global Const $STM_SETIMAGE = 0x0172
Global $msg
Global Const $hGUI = GUICreate("Display PNG Image in picture control", 600, 250)
Global Const $idPic = GUICtrlCreatePic("", 215, 20)
_GDIPlus_Startup()
Global Const $png = StringReplace(@AutoItExe, "autoit3.exe", "Examples\GUI\Torus.png")
Global Const $hImage = _GDIPlus_ImageLoadFromFile($png)
Global Const $Bmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_WinAPI_DeleteObject(GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $Bmp))
GUISetState()

While True
    $msg = GUIGetMsg()
    Switch $msg
         Case $idPic
             MsgBox(0, "Information", "PNG image was clicked")
        Case $GUI_EVENT_CLOSE
            _WinAPI_DeleteObject($Bmp)
            _GDIPlus_ImageDispose($hImage)
            _GDIPlus_Shutdown()
            GUIDelete($hGUI)
            Exit
    EndSwitch
WEnd
Este anda, pero cuando minimizo el GUI, se deforman las imagenes :(

Algun solucion?

EDITO: Encontre la solucion momentanea agregando el tamaño de la imagen a "Global Const $idPic = GUICtrlCreatePic("", 215, 20)".Es momentanea, porque como trabajo con imagenes de 20x20 no se nota si se deforma o no, pero en la imagen del ejemplo si se nota. No es una solucion fiable para trabajar con imagenes grandes.

Otra cosa, cuando sale del porgrama usa los siguientes codes

Código: Seleccionar todo

_WinAPI_DeleteObject($Bmp)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
Es obligacion usarlo o como se cierra el GUI, ya se cierra todo?

Re: PNG en TAB

Publicado: 16 Abr 2012, 08:59
por Ximorro
Como siempre no se pueden probar tus programas porque no los pones. Hay gente que no se molesta en hacer el programa y piden directamente que se lo hagamos. No es tu caso porque tú te lo curras pero no nos pones el código y nos toca hacerlo desde cero, como si no lo hubieras hecho :-(

Bueno, como ya has encontrado una solución a tu problema pues todo bien, no voy a ponerme a hacerlo.

¿Por qué no usas simplemente el que pinta después de tu GUI? Lo que tienes que hacer es pintarlo sólo cuando esté activo el tab donde quieres que aparezca. Realmente no estará en el tab pero lo parecerá.

De todas maneras parece que el del PictureControl es el mejor, ¿cómo que se deforma? ¿Quieres decir que lo solucionas poniendo
Global Const $idPic = GUICtrlCreatePic("", 215, 20, 20, 20)?
¡Claro!, lo mejor será que el PictureControl tenga el tamaño del png ¿no?
por cierto, que no sé por qué lo hará constante, igual que el GUI, curioso...

Y sí, es imprescindible que cierres bien el GDI+, éste crea muchos recursos en el sistema y si no se liberan bien pueden quedar handlers a objetos después de cerrar tu programa.

Re: PNG en TAB

Publicado: 16 Abr 2012, 21:32
por avechuche
Ximorro escribió:Como siempre no se pueden probar tus programas porque no los pones. Hay gente que no se molesta en hacer el programa y piden directamente que se lo hagamos. No es tu caso porque tú te lo curras pero no nos pones el código y nos toca hacerlo desde cero, como si no lo hubieras hecho :-(

Bueno, como ya has encontrado una solución a tu problema pues todo bien, no voy a ponerme a hacerlo.

¿Por qué no usas simplemente el que pinta después de tu GUI? Lo que tienes que hacer es pintarlo sólo cuando esté activo el tab donde quieres que aparezca. Realmente no estará en el tab pero lo parecerá.

De todas maneras parece que el del PictureControl es el mejor, ¿cómo que se deforma? ¿Quieres decir que lo solucionas poniendo
Global Const $idPic = GUICtrlCreatePic("",215, 20, 20, 20)?
¡Claro!, lo mejor será que el PictureControl tenga el tamaño del png ¿no?
por cierto, que no sé por qué lo hará constante, igual que el GUI, curioso...

Y sí, es imprescindible que cierres bien el GDI+, éste crea muchos recursos en el sistema y si no se liberan bien pueden quedar handlers a objetos después de cerrar tu programa.
Si se deforman. Si no le agrego el tamaño al "GUICtrlCreatePic" cuando minimizo y desp restauro, las imagenes se me agrandan y se deforman, lo que hice fue ponerle el tamaño y quedo bien. El ejemplo que di es funcional, copialo y pegalo y fijate como la foto se deforma. Se pixelea toda.
Lo de "Constante", no lo se, lo encontre asi.

Re: PNG en TAB

Publicado: 17 Abr 2012, 09:06
por Ximorro
Uy, puse en tamaño en la posición, quería decir:
Global Const $idPic = GUICtrlCreatePic("", 215, 20, 20, 20)
Ya lo he modificado arriba por si alguien lo lee que no lo líe.

Para la imagen del toro sería:
Global $idPic = GUICtrlCreatePic("", 215, 20, 193, 184)

Así no se deforman, hay que ponerle al PictureControl el tamaño de la imagen.

Ya sé que esos códigos son funcionales, pero el problema no era ese, tú tenías problemas para mostrarlos en los TAB, y para eso no teníamos código. Pero bueno con lo del PictureControl ya se encarga el formulario de repintar la imagen cuando corresponda.
Un código muy interesante éste de meter un png en un Picture. Lo de las constantes debe ser para asegurarse de que no se modifican los punteros, curioso.