Respecto al código de
Chefito:
EXACTAMENTE a eso me refería. No lo puse a ver si
dacu se animaba y lo hacía pero te has adelantado.
dacu, efectivamente si hubieras dicho más concretamente qué buscabas podíamos haberte ayudado mejor. Al principio parece que querías dibujar en el GUI y luego guardarlo a archivo (la primera opción que te puse era una posibilidad), pero parece que efectivamente ya tenías algo en el GUI y eso lo querías guardar (es la segunda opción con
BitBlt, como el código de
Chefito.
En realidad para lo del texto también se puede hacer con la primera opción, si escribes el texto con GDI+ en el bitmap, pero es más complicado... anda si es lo que intentas en el código, pues vamos a comentarlo:
Un par de cositas que no tienen que ver con los gráficos:
Si metes el código en una función, no crees variables globales, dentro de la función son locales...
Ojo que no has cerrado el archivo txt.
Modifícalo teniendo en cuenta los comentarios anteriores y tendrás un buen código, principalmente:
.- No hay que capturar la pantalla si no vas a usarla, mejor creas simplemente un bitmap compatible a partir del GUI.
.-
_GDIPlus_ImageGetGraphicsContext ¡¡no pinta de blanco!!, el contexto de una imagen es un objeto que se usa para dibujar en ella. Como te decía en un comentario anterior ¡sólo debes asignarlo una vez!, no cada vez que vayas a dibujar (no dentro del bucle). Para pintar de blanco (o cualquier relleno sólido) usa
_GDIPlus_GraphicsClear como en mi ejemplo, mucho mejor que pintar un rectángulo (más rápido y no usa un brush).
.-
Importantísimo: ¡Libera y destruye los objetos al final! Los de GDI+ con las funciones
Dispose correspondientes. Y si acabas usando la API de Windows (la llamo WinApi por la udf de AutoIt
) con los
Release o
Delete. Fíjate en nuestros dos ejemplos.
Tal como lo tienes, escribiendo con
_GDIPlus_GraphicsDrawString, no te hace falta pasar a
WinAPI para capturar la ventana, lo haces todo con GDI+.
Pero lo de
WinAPI también es una opción muy interesante porque te permitiría escribir el texto en un objeto label normal, donde puedes dar formato muy fácilmente, y luego capturarlo. Si te pones a hacer algo más complicado con los textos en GDI+ verás lo complicado que puede llegar a ser... se hace con
_GDIPlus_GraphicsDrawStringEx, aquí un ejemplo del trozo para escribir un simple label a ver si consigo asustarte:
Código: Seleccionar todo
$hBrushLbl = _GDIPlus_BrushCreateSolid(0xFF000000)
$hFormat = _GDIPlus_StringFormatCreate()
$hFamily = _GDIPlus_FontFamilyCreate("Microsoft Sans Serif")
$hFont = _GDIPlus_FontCreate($hFamily, 8.6, 0)
$hFontNeg = _GDIPlus_FontCreate($hFamily, 8.6, 1) ;versión negrita
$lbl1 = "El texto a escribir"
$aInfo1 = _GDIPlus_GraphicsMeasureString($hGraphic, $lbl1, $hFontNeg, _GDIPlus_RectFCreate(22, 68, 0, 0), $hFormat)
$aInfo1 = $aInfo1[0]
_GDIPlus_GraphicsDrawStringEx($ctxBuffer, $lbl1, $hFontNeg, $aInfo1, $hFormat, $hBrushLbl)
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontDispose($hFontNeg)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_BrushDispose($hBrushLbl)
Es una extracción de lo que usé en mi GUI con fondo animado con GDI+
http://www.emesn.com/autoitforum/viewto ... f=4&t=2302
En la cuarta versión, que es la buena. Fue una pesadilla...
¡Gracias por poner el código! Si lo hubieras puesto al principio ya nos habríamos enfocado en ese problema concreto.
Ya nos dices si tienes problemas para hacer las modificaciones que te sugerimos (si te parecen bien, claro, pero piensa que algunas son por errores y deberías hacerlas).