Forms estilo 'StayDown'  

Enviado Por: Radikal (Q3 Team)
Web : http://www.q3.nu
Email: radikal@q3.nu
Fecha: 12/01/00

Truco accedido 81 veces

 


Seguramente conocerás la forma de hacer una form 'StayOnTop', es decir, una form que siempre permanezca encima del resto.
Este truco consiste en todo lo contrario: hacer que la form siempre permanezca debajo del resto, sobre el escritorio.

Una forma de conseguir esto es ejecutando el siguiente código:


     SetWindowPos( Form1.Handle,
                   HWND_BOTTOM,
                   0,0,0,0,
                   SWP_NOMOVE or SWP_NOSIZE);



Ahora bien, esto está bien para colocarla al fondo, pero... ¿si queremos que siempre esté debajo?, ¿que eventos hemos de usar para conseguirlo?
Yo los he buscado, pero no conseguí hacer que funcionase limpiamente y sin parpadeos, así que al final desistí de usar dicho código.
Resolví el tema mediante el mensaje WM_WindowPosChanging que Windows envia a la form antes de producir un cambio de posicion, tamaño o orden visual (Z Order) en la form.
Dicho mensaje, nos permite tomar cartas en el asunto, y permitir o no que la form se mueva o cambie de tamaño.

Vamos con el ejemplo:

  • Primero capturamos el mensaje, para lo cual, añadiremos una linea en la parte private de nuestra form:


     type
       TForm1 = class(TForm)
         Button1: TButton;
         procedure Button1Click(Sender: TObject);
         procedure FormActivate(Sender: TObject);
       private
         { Private declarations }
         {Esta linea:/This Line:}
         procedure Chivato(var m: TWMWINDOWPOSCHANGED);
                          message WM_WindowPosChanging;
       public
         { Public declarations }
       end;
    



  • Ahora, tenemos que poner la implementación de la procedure 'Chivato' que será quien trate el mensaje convenientemente. La pondremos, por supuesto, en la implementation de la form:


     procedure TForm1.Chivato(var m: TWMWINDOWPOSCHANGED);
     begin
       m.WindowPos.hwndInsertAfter:=HWND_BOTTOM;
     end;
    



    y esto es todo.

    El funcionamiento es muy sencillo:
    Uno de los parámetros del mensaje es WindowPos, que no es más que una estructura en la que Windows nos informa de los nuevos parámetros de la ventana (tamaño y posicion).
    Si lo dejamos correr, el cambio se producirá. Sin embargo, si cambiamos algúno de los parámetros, la ventana tomará el aspecto y posición que le indiquemos en el cambio.
    En este truco, tan sólo utilizaremos el parámetro hwndInsertAfter, en el cual pondremos la constante HWND_BOTTOM para que situe la ventana al fondo.