Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #12  
Antiguo 06-02-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por pepe2000
cuando se coloca cerrar sesion en Windows XP y nos demoramos en cerrar la sesion; o cuando cambiamos la apariencia de Windows XP a plateado u Olivo, aparece un formulario con el msg: "ESPERE", pero lo que queda por detrás se convierte maravillosamente en un color gris (pruebenlo!)
Excelente efecto de windows que quiero reproducir (ya que siempre utilizo showmodal). Alguien a intentado algo como esto?
Le he estado dando vueltas al asunto y no parece muy sencillo, o al menos a mí no se me ocurre algo que me lo parezca. Verás. Creo que Windows utiliza un pequeño "truco" para lograr el efecto que dices. Este consiste en realizar una captura de pantalla del escritorio en el momento de ejecutar, por ejemplo, el diálogo para apagar, reiniciar, cerrar sesión, etc.

Es decir, Windows captura la pantalla justo antes de mostrar el diálogo y a continuación juega con esa imagen que acaba de capturar. De una manera más o menos sencilla puede conseguirse, por ejemplo, capturando la pantalla en una variable "TBitmap". A continuación asignamos dicho "Bitmap" (con la captura) en una variable de tipo "TJPEGImage", de tal modo que podamos utilizar la propiedad "Grayscale" de esta última variable.

Si luego volvemos a cargar la imagen contenida en la variable "Jpg" en la variable de tipo "TBitmap" podremos copiar esta imagen en el propio escritorio, consiguendo que este se vea "gris". Creo que si echas un vistazo o pruebas el siguiente código fuente podrás comprobar por ti mismo lo que digo o trato de decir:

Código Delphi [-]
uses
  Jpeg;

procedure CosaRaraDeDomingoNoche;
var
  altoPantalla,
  anchoPantalla: integer;
  bitmapTemp: TBitmap;
  jpgTemp: TJPEGImage;
  archivoTemp,
  directorioTemp: array[0..MAX_PATH] of char;
begin
  anchoPantalla := Screen.Width;
  altoPantalla := Screen.Height;
  bitmapTemp := TBitmap.Create;
  jpgTemp := TJPEGImage.Create;
  GetTempPath(SizeOf(directorioTemp), directorioTemp);
  GetTempFileName(directorioTemp, nil, 0, archivoTemp);
  try
    bitmapTemp.Width := anchoPantalla;
    bitmapTemp.Height := altoPantalla;
    BitBlt(bitmapTemp.Canvas.Handle, 0, 0,
      anchoPantalla, altoPantalla, GetDC(0), 0, 0, SRCCOPY);
    jpgTemp.Grayscale := true;
    jpgTemp.Assign(bitmapTemp);
    jpgTemp.SaveToFile(archivoTemp);
    FreeAndNil(jpgTemp);
    FreeAndNil(bitmapTemp);
    bitmapTemp := TBitmap.Create;
    jpgTemp := TJPEGImage.Create;
    jpgTemp.LoadFromFile(archivoTemp);
    bitmapTemp.Assign(jpgTemp);
    BitBlt(GetDC(0), 0, 0, anchoPantalla, altoPantalla,
      bitmapTemp.Canvas.Handle, 0, 0, SRCCOPY);
  finally
    jpgTemp.Free;
    bitmapTemp.Free;
    DeleteFile(archivoTemp);
  end;
end;

procedure TfrmSecundario.FormCreate(Sender: TObject);
begin
  CosaRaraDeDomingoNoche;
end;
Sin embargo, como podrás comprobar, existen problemas: no pocos problemas, derivados de que el escritorio sigue "activo", con lo cual la imagen en blanco y negro no se mantiene, o se mantiene "a trozos". En definitiva, yo no he sabido hacerlo mejor de este modo. O ya me cansé de intentarlo, por lo que luego diré.

El caso es que creo que Windows va un poco más allá con el truco de marras. Verás. Aun mejorando muchísimo lo que he expuesto más arriba, tu aplicación podrá moverse por la pantalla, cosa que "borraría" la imagen en blanco y negro que acabábamos de copiar en el escritorio.

Si te fijas en Windows, al menos en su versión XP, el diálogo para apagar, reiniciar, cerrar sesión, etc., no puede moverse... es posible que para evitar lo que he dicho más arriba. Sin embargo, he dicho también que parece que Windows va un poco más allá. ¿En qué sentido?

Pues en que una posible solución a nuestro problema sería no pintar la imagen en blanco y negro en el escritorio "activo", sino en otro escritorio, en uno que podemos crear nosotros mismos. He seguido unos pasos iniciados por Román en estos mismos Foros para crear escritorios y ejecutar aplicaciones en dichos escritorios creados por nosotros mismos.

El problema que me he encontrado es que para que lo anterior funcione se necesitarían dos aplicaciones. Una que crearía un nuevo escritorio y que además ejecutaría una segunda aplicación ya dentro de ese nuevo escritorio. De ese modo en dicho escritorio solamente aparecería una aplicación: la tuya.

Creo que Windows consigue el efecto de ese modo. Esto es, si no estoy equivocado (aunque me temo que sí, porque además debe haber formas más elegantes de conseguir lo que te propones sin recurrir al lío que estoy tratando de explicar más o menos, por si te atreves con ello), digo que, si no estoy equivocado, el diálogo que sirve en Windows XP para reiniciar, apagar, cerrar la sesión, etc., es en realidad un programa, que se ejecuta en un escritorio creado para él.

Esto último lo he comprobado por mí mismo y funciona más o menos bien. Lo que no me convence es que sean dos las aplicaciones necesarias. Esto es, creo que ha de haber alguna forma de hacer que una aplicación pase de ejecutarse en un escritorio a ejecutarse en otro, precisamente, creado desde esta misma aplicación.

Pero, de todos modos, creo que todo esto es demasiado para lo que pretendes conseguir, o me lo parece a mí. Quiere decirse que tal vez no merezca la pena plantearse algo así, si no es por un motivo importante o que al menos lo parezca, nos sé, no porque nos apetezca, porque ya ves que requiere de cierto tinglado que puede no merecer la pena.

También estoy pensando ahora que si se quiere... es cuestión de ponerse a ello. Bueno. Por mi parte adjunto el código fuente de dos aplicaciones que, basándose en código fuente escrito por Román en estos Foros, logran, al menos en parte, el efecto que te llama la atención y quisieras utilizar. Huelga decir que todo lo he hecho rápidamente y con cierta desgana (sobre todo a lo último), así que, te pido disculpas por no comentar en absoluto el código fuente y eso.

Disculpas también por el rollo que acabo de soltar.
Archivos Adjuntos
Tipo de Archivo: zip quecosa.zip (5,7 KB, 48 visitas)
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
 



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
Al cerrar Form no entra en OnClose nowheremanza OOP 2 13-09-2005 14:04:41
Poner color background del form cuando pierde el foco Cabanyaler Gráficos 4 25-11-2004 08:32:03
Impedir mover el form y redimensionar al mover barra tareas jealousy API de Windows 0 15-06-2004 12:58:05
Poner un fondo en el form hook Gráficos 2 13-05-2004 18:14:35
como puedo poner form hijos ronimaxh Varios 5 22-10-2003 22:55:23


La franja horaria es GMT +2. Ahora son las 02:00:26.


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