Desplazar una ventana sin barra de título

2753 vistas

Sin barra de título, el usuario no puede desplazar la ventana con la ayuda del ratón. No obstante, es posible de simular este comportamiento con un clic sobre el formulario. Este método debe usarse en el caso de que la propiedad BorderStyle=bsNone.

En el evento OnMouseDown hacemos:



delphi
  1. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  2.   Shift: TShiftState; X, Y: Integer);
  3. begin
  4.   ReleaseCapture;
  5.   Perform(WM_SysCommand, SC_MOVE, 0);
  6. end;



Este método puede aplicarse a cualquier descendiente de TWinControl.

Otro manera de hacerlo es usar el mensaje WM_NCHITTEST enviado por Windows a la ventana cuando el usuario mueve el ratón. La respuesta de este mensaje es usado por Windows para determinar en qué zona se encuentra el ratón: en la parte cliente, sobre un botón de sistema, en uno de los bordes,... Una de estas respuestas es la que nos interesa particularmente. Es el valor HTCAPTION el que indica a Windows que el cursor se encuentra an la barra de título. En este caso, Windows interpretará el desplazamiento del ratón con el botón izquierdo pulsado como un desplazamientode la ventana. Es exactamente lo que nos interesa. Vamos a crear un procedimiento que nos gestione dicho mensaje.

El siguiente ejemplo autoriza el desplazamiento si el cursor se encuentra en los 20 pÃxels más altos de la ventana, lo que nos permite simular nuestra propia barra de título.



delphi
  1. interface
  2.  
  3. uses
  4.   Windows, Messages, Classes, Forms;
  5.  
  6. type
  7.   TForm1 = class(TForm)
  8.   private
  9.   public
  10.     procedure WMNCHitTest(var msg: TWMNCHitTest); message WM_NCHITTEST;
  11.   end;
  12.  
  13. var
  14.   Form1: TForm1;
  15.  
  16. implementation
  17.  
  18. {$R *.DFM}
  19.  
  20. procedure TForm1.WMNCHitTest(var msg: TWMNCHittest);
  21. var
  22.   pt: TPoint;
  23. begin
  24.   inherited;
  25.  
  26.   pt := ScreenToClient(Point(msg.XPos, msg.YPos));
  27.   if PtInRect(Rect(0, 0, ClientWidth, 20), pt) then
  28.     msg.Result := HTCAPTION;
  29. end;