Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-10-2006
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Poder: 20
afxe Va por buen camino
Captura de pantalla en el OnDeactivate

Hola foristas.

He realizado un programa mdi en el cual al desactivarse un form capturo el area cliente del form desactivado (con la api bitblt), lo grabo como bitmap, lo recupero en un TImage, lo obscurezco y lo repinto en el form desactivado, para dar la impresión de dejarlo "en la sombra" (en el evento OnActivate hago desaparecer el TImage, apareciendo de nuevo el form claro y nítido).

Código:
procedure TFrmB_Base.FormDeactivate(Sender: TObject);
var
  B: TBitmap;
  SrcDC : HDC;
  iLT : Integer;
begin
  iLT := GetSystemMetrics(SM_CYCAPTION);
  B := TBitmap.Create;
  B.Width  := Self.Width;
  B.Height := Self.Height-iLT;
  try
    SrcDC := GetWindowDC(Self.Handle);
    BitBlt(B.Canvas.handle, 0, 0, B.Width, B.Height, SrcDC, 0, iLT, SRCCOPY);
  finally
    ReleaseDC(Self.Handle, SrcDC);
  end;
  b.SaveToFile ('c:\t.bmp');
  b.Free;
  MiPanel.Align := alClient;
  Image2.Picture.LoadFromFile('c:\t.bmp');
  MiPanel.Visible := True;
  MiPanel.BringToFront;
  OscurecerTImage(Image2, 180);
end;
(El componente TImage está dentro de un TPanel, para que se superponga a cualquier otro componente del form)

¿El problema? Pues que el evento OnDeactivate, que es donde hago la captura de pantalla, se lanza despues del OnCreate del nuevo Form, por lo cual en la captura realizada aparece el borde y el caption del Form que se está creado, pues hasta que no se ha creado no ha cojido el foco y no se lanza el evento Deactivate.

Creo haber rebuscado bastante en el foro pero no he encontrado la solución a esta pregunta: ¿Cómo puedo capturar el área cliente de un form sin tener en cuenta lo que pueda tener "superpuesto"?

Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 03-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Dependiendo de la versión de delphi que tengas, el formulario tendrá el método GetFormImage, que provoca que todos los controles del formulario se dibujen en un bitmap. Es decir:

Código Delphi [-]
var
  Bitmap: TBitmap;
begin
  Bitmap:= GetFormImage;
  try
    // Aquí tienes el formulario dibujado en un bitmap, haz con el lo que quieras
  finally
    Bitmap.Free;
  end;
end;
Responder Con Cita
  #3  
Antiguo 04-10-2006
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Poder: 20
afxe Va por buen camino
De piedra....

Después de dejarme los ojos buscando información sobre captura de pantallas en el foro me cuentas que esto:
Código:
var
  B: TBitmap;
  SrcDC : HDC;
  iLT : Integer;
begin
  iLT := GetSystemMetrics(SM_CYCAPTION);
  B := TBitmap.Create;
  B.Width  := Self.Width;
  B.Height := Self.Height-iLT;
  try
    SrcDC := GetWindowDC(Self.Handle);
    BitBlt(B.Canvas.handle, 0, 0, B.Width, B.Height, SrcDC, 0, iLT, SRCCOPY);
  finally
    ReleaseDC(Self.Handle, SrcDC);
  end;
  b.SaveToFile ('c:\t.bmp');
  b.Free;
end;
Equivale exactamente a esto:

Código:
begin
  GetFormImage.SaveToFile('c:\t.bmp');
end;
y sin el inconveniente de que capture las pantallas superpuestas.... pues eso.... de piedra .

Mil Gracias Seoane, era lo que necesitaba.
Responder Con Cita
  #4  
Antiguo 04-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Solo dos apuntes, GetFormImage devuelve un TBitmap y hay que destruirlo cuando ya no lo necesitemos, de lo contrario quedara en memoria. Y segundo, si lo que quieres es mostrar la imagen en un TImage no hace falta que lo guardes primero en disco, el objeto TImage cuenta con el método Assign que cumple perfectamente esa función.

Código Delphi [-]
var
  Bitmap: TBitmap;
begin
  Bitmap:= GetFormImage;
  try
    Image1.Picture.Assign(Bitmap);
  finally
    // Importante destruir el bitmap
    Bitmap.Free;
  end;
end;
Responder Con Cita
  #5  
Antiguo 04-10-2006
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Poder: 20
afxe Va por buen camino
Oido cocina.

Efectivamente... tras estar trabajando alocadamente con el aplicativo he obtenido un bonito error de memoria insuficiente.

Gracias por ambos consejos. Ahora estoy tratando de resolver una cosa... Tengo un grid predefinido dentro de un frame que he usado en los forms (uso las infopower y D7). Al capturar la pantalla, si el foco está fuera del Grid o, si está en el grid, el foco lo tiene el InplaceEditor del Grid, no hay problema, pero si el foco lo tiene el Grid solo aparece en la captura la celda seleccionada, el resto del grid es un gran cuadrado gris . Raro no???

Gracias de nuevo Seoane.
Responder Con Cita
  #6  
Antiguo 04-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por afxe
Raro no???
Pues no es tan raro, el método GetFormImage crea un bitmap y fuerza a cada uno de los componentes a dibujarse en el. En principio el método es ideal porque es independiente de lo que realmente se este viendo en la pantalla, pero también hay que ver como interpretan los componentes la orden de dibujarse. Parece ser que a ese componente en concreto se le atraganta la orden, pero ese ya es problema del componente.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
aplicación de captura de pantalla? pvizcay Varios 1 01-10-2006 18:29:28
Captura pantalla walito Gráficos 11 28-01-2006 01:37:05
Captura de errores scooterjgm OOP 3 04-10-2004 16:52:39
Tecnicas para captura de pantalla diegofhernando Varios 0 21-07-2004 17:31:38
Captura de pantalla craven API de Windows 1 29-08-2003 15:51:39


La franja horaria es GMT +2. Ahora son las 23:18:58.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi