FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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 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. |
#2
|
||||
|
||||
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:
|
#3
|
|||
|
|||
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; Código:
begin GetFormImage.SaveToFile('c:\t.bmp'); end; Mil Gracias Seoane, era lo que necesitaba. |
#4
|
||||
|
||||
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.
|
#5
|
|||
|
|||
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. |
#6
|
||||
|
||||
Cita:
|
|
|
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 |
|