Ver Mensaje Individual
  #1  
Antiguo 03-10-2006
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Reputación: 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