PDA

Ver la Versión Completa : Canvas (ventana minimizada)


ganegri
14-07-2007, 04:08:56
Buenas a todos.
Estoy tratando de trabajar con el canvas de un form minimizado, o no visible. Esto es posible?
Si es asi agradecería alguna referencia u orientación para investigar, pues no encuentro mucho.

Saludos, Gabriel.-

cHackAll
14-07-2007, 04:17:20
De poder trabajar claro que se puede trabajar, pues cuando creas una ventana cualfuese, tambien a esta el Güindos le asigna un Canvas... ahora el problema depende de lo que quieras hacer con dicho canvas, por ejemplo si quieres imprimir (muy común), y haces tu el código de impresion es posible que los componentes de tu formulario como estan Visible = False no se refresquen.

Pero en todo caso puede que haya una alternativa un poco más adecuada por ejemplo usar un TBitmap que normalmente se conoce Buffer doble.

Talvez si nos comentas mas concretamente lo que quieres te colemos un código más "ilustrativo"

ganegri
14-07-2007, 04:29:13
Que tal cHackAll?
Tengo un proceso que actualiza el canvas de un tpanel, dependiendo de algunos parametros. Luego de actualizado lo guardo como imagen.
Cuando la ventana esta activa, no tengo problemas, pero lo que quisieraseria que este proceso tambien se pueda ejecutar con la ventana minimizada o invisible, o detras de otra.
Lo que pasa ahora es que al enviar al fondo la ventana que contiene el tpanel, me "cambia" el canvas que tomaba del rectangulo del tpanel a lo que se ve al cambiar/minimizar la ventana.

Saludos, espero haberme explicado algo mejor.
Cualquier sugerencia es bienvenida.
Gabriel.-

cHackAll
17-07-2007, 02:59:34
...Tengo un proceso que actualiza el canvas de un tpanel...Vaya, no se por qué no se me ocurrió un poco antes el motivo: el objeto TPanel tiene asociado un objeto TCanvas como privado, NO es público, así que no tenemos forma de acceder a él a pesar de que heredemos la clase en un nueva clase de panel con TCanvas... por lo que nos cuentas para poder "pintar" en él, lo que haces es obtener el manejador desde la GDI verdad??? pues bueno la API GetDC y GetWindowDC no son lo apropiado para realizar lo que estas haciendo, y muy probablemente tampoco el TPanel.

Utiliza un TPaintBox en ves del TPanel... con éste puedes usar el evento OnPaint como veas más apropiado si no quieres dejar de usar el borde que te deja un panel, en el evento citado utiliza:

var Rect: TRect;
begin
...
Rect := PaintBox1.ClientRect;
Frame3D(PaintBox1.Canvas, Rect, clBtnHighlight, clBtnShadow, 1);
...

Si tu Bevel está en bvLowered
Frame3D(PaintBox1.Canvas, Rect, clBtnShadow, clBtnHighlight, 1);

el resto seguramente será copia de lo que ya tienes.

Saludos!

roman
17-07-2007, 18:24:25
el objeto TPanel tiene asociado un objeto TCanvas como privado, NO es público, así que no tenemos forma de acceder a él a pesar de que heredemos la clase en un nueva clase de panel con TCanvas

La propiedad Canvas está declarada en TCustomControl como protegida, no como privada, por lo que sí puede accederse a él en una clase derivada.

// Saludos

cHackAll
17-07-2007, 22:45:40
StringReplace('...el objeto TPanel tiene asociado un objeto TCanvas como privado, NO es público, así que no tenemos forma de acceder a él a pesar de que heredemos la clase...', 'privado', 'protegido', [rfIgnoreCase]);

Gracias amigo roman... allí tienes ganegri un pequeño BUG en la teoría!

Saludos!