Redimensionar un formulario sin bordes

3353 vistas

Como hemos visto en el ejemplo del [iurl=85&fs=182#225]desplazamiento de la ventana sin barra de título[/iurl], vamos a simular la presencia de los bordes en una ventana que tiene la propiedad BorderStyle = bsNone.

Al mover el ratón por la ventana, Windows envía el mensaje WMHitTest que devuelve la posición del ratón en la pantalla. Por lo tanto, sólo es necesario establecer una zona, por ejemplo a la derecha de la ventana, donde enviaremos un mensaje diciendo que el redimensionado es posible.

Declaración:



delphi
  1. {public}
  2.     procedure WMNCHitTest(var msg: TWMNCHitTest); message WM_NCHITTEST;



Implementación



delphi
  1. procedure TForm1.WMNCHitTest(var msg: TWMNCHittest);
  2. var
  3.   pt: TPoint;
  4. begin
  5.   // coger la posición del ratón
  6.   pt := ScreenToClient(Point(msg.XPos, msg.YPos));
  7.  
  8.   // miramos si el ratón está en la zona deseada
  9.   if PtInRect(Rect(ClientWidth-5, 0, ClientWidth, ClientHeight), pt) then
  10.   begin
  11.     msg.Result:= HTRIGHT;
  12.     exit;
  13.   end;
  14. end;



Este código nos permite el redimensionado por el lado derecho del formualrio cuando el ratón esté a 5 pÃxels del borde.

Nota1:
Para recrear un redimensionado clásico tendrÃamos que chequear por todos los lados y cada una de las esquinas del formulario.
Sobretodo mirar primero las esquinas y hacer un Exit si lo fuera, porque siempre estamos en un borde.

Algunos resultados a usar:
  • Borde inferior: HTBOTTOM
  • Borde izquierdo: HTLEFT
  • Borde derecho: HTRIGHT
  • Borde superior: HTTOP

Podemos ver todas las constantes en el MSDN

Nota2:
Este procedimiento sólo funciona cuando el ratón pasa sobre el formulario. Si tenemos un TDBGrid con align=alClient no nos funcionará. La solución es tener TPannels con Enabled=false alrededor del formulario (con Align=AlLeft, AlRight,..) y de 2 o 3 pixels de anchura.