Si está desarrollando aplicaciones gráficas o multimedia, es posible que se pregunte cómo mover un formulario sin utilizar su barra de título. De hecho, solo necesita arrastrar el área del cliente del formulario con el mouse.
Método uno
La siguiente es la forma más común de realizar la función anterior: agregue la siguiente declaración de procedimiento en la sección Declaración privada del formulario:
procedimiento WMNCHitTest(var Msg:TWMNCHitTest);mensaje WM_NCHITTEST;
Luego agregue el siguiente código en la sección de implementación:
procedimiento TForm1{o el nombre del formulario que definiste}.WMNCHitTest(var Msg:TWMNCHitTest);
comenzar
Controlador predeterminado (mensaje);
si Msg.Result = HTCLIENT entonces
Resultado.mensaje:= HTCAPTION;
fin;
Este método hace que Windows piense que se hizo clic en la barra de título cuando el mouse hace clic en el área del cliente del formulario.
Método dos
Aquí hay otra forma de mover una forma normal con el mouse.
procedimiento TForm1.FormMouseMove(Remitente: TObject; Shift: TShiftState; X, Y: Entero);
comenzar
si (ssLeft en Shift) entonces comienza
Liberar captura;
Enviar mensaje (Form1.Handle, WM_SYSCOMMAND, SC_MOVE+1,0);
fin;
fin;
Imperfecciones de los métodos anteriores.
Veamos qué sucede cuando la opción "Mostrar contenido de la ventana mientras se arrastra" está desactivada. Esta es una configuración para Windows. Puede encontrar esta propiedad en "Menú Inicio --> Configuración --> Opciones de carpeta --> Ver --> Configuración avanzada". En Windows95, es necesario modificar el registro. Cuando esta propiedad se establece como no válida, el formulario cambiará a un contorno cuadrado cuando se arrastre. Quizás uses una forma irregular, pero aún muestra contornos.
Cuando desee que su formulario esté acoplado en el borde de la pantalla (por ejemplo: WinAmp, cuando arrastra el formulario a una posición específica en la parte superior de la pantalla, el formulario estará cerca de la parte superior de la pantalla), si utilice el segundo paso anterior. De esta manera, no podrá manejar la posición del formulario hasta que suelte el botón del mouse y no podrá manejar los problemas de acoplamiento.
A continuación utilizaré métodos simples para resolver dos problemas:
Primero, no importa cuál sea la configuración, el contorno no se mostrará al arrastrar el formulario;
En segundo lugar, la detección de posición se realiza cuando se mueve el formulario y se acopla en una ubicación específica cuando la posición es apropiada.
Es posible que muchas personas hayan resuelto estos problemas, pero tal vez el siguiente código le ayude.
Método tres
El siguiente código se puede copiar directamente en Delphi, siempre que guarde Form1 como uMain.pas y Form2 como uDock.pas. Los eventos utilizados son: OnMouseDown, OnMouseMove, OnMouseUp, OnShow (Form1).
Este es un método para mover un formulario basado en el movimiento del mouse, incluidos dos formularios, uMain y uDock (Form1 y Form2). Form2 se abre a través de Form1 y se puede acoplar a la parte inferior de Form1. Una vez acoplado, Form2 se moverá con Form1 hasta que usted quite Form2 del camino.
Formulario1
unidad uPrincipal;
interfaz
usos
Windows, Mensajes, SysUtils, Clases, Gráficos, Controles, Formularios, Diálogos;
tipo
TForm1 = clase(TForm)
procedimiento FormMouseDown(Remitente:TObject; Botón:TMouseButton;Shift:TShiftState;X,Y: Entero);
procedimiento FormMouseMove(Remitente: TObject; Shift: TShiftState;X,Y: Integer);
procedimiento FormMouseUp(Remitente:TObject;Botón:TMouseButton;Shift:TShiftState;X,Y: Entero);
procedimiento FormShow(Remitente: TObject);
privado
{Declaraciones privadas}
público
DocktoForm: booleano;
{Declaraciones públicas}
fin;
var
Formulario1: TForm1;
CanMove, CanMoveX, CanMoveY: booleano;
OldX, OldY: entero;
F1X,F1Y,F2X,F2Y: entero;
Área de trabajo: TRect;
implementación
utiliza uDock;
{$R *.DFM}
procedimiento TForm1.FormMouseDown(Remitente: TObject; Botón: TMouseButton;Shift: TShiftState; X, Y: Entero);
comenzar
CanMoveX := verdadero;
PuedeMoveY := verdadero;
Puede moverse := verdadero;
AntiguoX := X;
AntiguoY := Y;
siDocktoForm entonces
comenzar
F1X := Formulario1.Izquierda;
F1Y := Formulario1.Arriba;
F2X := Formulario2.Izquierda;
F2Y := Formulario2.Arriba;
fin;
fin;
procedimiento TForm1.FormMouseMove(Remitente: TObject; Shift: TShiftState; X, Y: Entero);
comenzar
si (puede moverse) entonces
comenzar
si CanMoveX entonces
Formulario1.Izquierda := Formulario1.Izquierda + (X - AntiguoX);
si CanMoveY entonces
Form1.Top := Form1.Top + (Y - AntiguoY);
//Esta sección se engancha en la parte superior
si (Form1.Top < WorkArea.Top + 10) y (Form1.Top > WorkArea.Top-10) entonces
comenzar
Formulario1.Arriba := Área de Trabajo.Arriba;
si (Y-OldY > 10) o (Y-OldY < -10) entonces
CanMoveY := verdadero
demás
PuedeMoveY := Falso;
fin;
//Esta sección se engancha en el lado izquierdo
si (Form1.Left < WorkArea.Left+10) y (Form1.Left > WoskArea.Left-10) entonces
comenzar
Formulario1.Izquierda := Área de Trabajo.Izquierda;
si (X-OldX > 10) o (X-OldX < -10) entonces
CanMoveX: = verdadero
demás
CanMoveX := Falso;
fin;
//Esta sección se engancha en el lado derecho
si (Form1.Left > WorkArea.Right-Form1.Width-10) y (Form1.Left < WorkArea.Right-Form1.Width+10) entonces
comenzar
Form1.Left := WorkArea.Right-Form1.Width;
si (X-OldX > 10) o (X-OldX < -10) entonces
CanMoveX: = verdadero
demás
CanMoveX := Falso;
fin;
//Esta sección se engancha a la barra de tareas
siDocktoForm entonces
comenzar
si (Form1.Top > WorkArea.Bottom-Form1.Height-Form2.Height-10) y (Form1.Top < WorkArea.Bottom-Form1.Height-Form2.Height+10) entonces
comenzar
Form1.Top := WorkArea.Bottom-Form1.Height-Form2.Height;
si (Y-OldY > 10) o (Y-OldY < -10) entonces
CanMoveY := verdadero
demás
CanMoveY := Falso;
fin;
fin
si no, empezar
si (Form1.Top > WorkArea.Bottom-Form1.Height-10) y (Form1.Top < WorkArea.Bottom-Form1.Height+10) entonces
comenzar
Form1.Top := WorkArea.Bottom-Form1.Height;
si (Y-OldY > 10) o (Y-OldY < -10) entonces
CanMoveY := verdadero
demás
PuedeMoveY := Falso;
fin;
fin;
siDocktoForm entonces
comenzar
Form2.Left := Form1.Left - (F1X-F2X);// + (X-OldX);
Formulario2.Arriba := Formulario1.Arriba+Form1.Altura;
salida;
fin;
//Esta sección bloquea la lista de reproducción en el centro de Form1
if (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) y (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.Width div 2))+10) y
(Form2.Top > Form1.Top+Form1.Height-10) y (Form2.Top < Form1.Top+Form1.Height+10) luego
comenzar
Form2.Left := Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2));
DocktoForm := Verdadero;
F1X := Formulario1.Izquierda;
F1Y := Formulario1.Arriba;
F2X := Formulario2.Izquierda;
F2Y := Formulario2.Arriba;
fin;
fin;
fin;
procedimiento TForm1.FormMouseUp(Remitente: TObject; Botón: TMouseButton; Mayús: TShiftState; X, Y: Entero);
comenzar
PuedeMoverse := false;
fin;
procedimiento TForm1.FormShow(Remitente: TObject);
comenzar
//Obtener parámetros del área de trabajo
SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
Formulario2.Mostrar;
fin;
fin.
Formulario2
unidad uDock;
interfaz
usos
Windows, Mensajes, SysUtils, Clases, Gráficos, Controles, Formularios, Diálogos;
tipo
TForm2 = clase(TForm)
procedimiento FormMouseDown(Remitente: TObject; Botón: TMouseButton;Shift: TShiftState; X, Y: Entero);
procedimiento FormMouseMove(Remitente: TObject; Shift: TShiftState; X,Y: Entero);
procedimiento FormMouseUp(Remitente: TObject; Botón: TMouseButton;Shift: TShiftState; X, Y: Entero);
privado
{Declaraciones privadas}
público
{Declaraciones públicas}
fin;
var
Formulario2: TForm2;
CanMove, CanMoveX, CanMoveY, DocktoForm: booleano;
OldX, OldY: entero;
implementación
utiliza uMain;
{$R *.DFM}
procedimiento TForm2.FormMouseDown(Remitente: TObject; Botón: TMouseButton;Shift: TShiftState; X, Y: Entero);
comenzar
CanMoveX := verdadero;
PuedeMoveY := verdadero;
Puede moverse := verdadero;
AntiguoX := X;
AntiguoY := Y;
fin;
procedimiento TForm2.FormMouseMove(Remitente: TObject; Shift: TShiftState; X, Y: Entero);
comenzar
si (puede moverse) entonces
comenzar
si CanMoveX entonces
Form2.Left := Form2.Left + (X - OldX);
si CanMoveY entonces
Form2.Top := Form2.Top + (Y - AntiguoY);
//Esta sección se engancha en la parte superior
si (Form2.Top < WorkArea.Top + 10) y (Form2.Top > WorkArea.Top-10) entonces
comenzar
Form2.Top := Área de trabajo.Top;
si (Y-OldY > 10) o (Y-OldY < -10) entonces
CanMoveY := verdadero
demás
PuedeMoveY := Falso;
fin;
//Esta sección se engancha en el lado izquierdo
si (Form2.Left < WorkArea.Left+10) y (Form2.Left > WorkArea.Left-10) entonces
comenzar
Formulario2.Izquierda := Área de Trabajo.Izquierda;
si (X-OldX > 10) o (X-OldX < -10) entonces
CanMoveX: = verdadero
demás
CanMoveX := Falso;
fin;
//Esta sección se engancha en el lado derecho
si (Form2.Left > WorkArea.Right-Form2.Width-10) y (Form2.Left < WorkArea.Right-Form2.Width+10) entonces
comenzar
Form2.Left := WorkArea.Right-Form2.Width;
si (X-OldX > 10) o (X-OldX < -10) entonces
CanMoveX: = verdadero
demás
CanMoveX := Falso;
fin;
//Esta sección se engancha a la barra de tareas
si (Form2.Top > WorkArea.Bottom-Form2.Height-10) y (Form2.Top < WorkArea.Bottom-Form2.Height+10) entonces
comenzar
Form2.Top := WorkArea.Bottom-Form2.Height;
si (Y-OldY > 10) o (Y-OldY < -10) entonces
CanMoveY := verdadero
demás
PuedeMoveY := Falso;
salida;
fin;
//Esta sección se engancha a la parte inferior del jugador.
if (Form2.Top > Form1.Top+Form1.Height-10) y (Form2.Top < Form1.Top+Form1.Height+10) y (Form2.Left > Form1.Left-Form2.Width) y (Form2. Izquierda <Form1.Left + Form1.Width) luego
comenzar
Formulario2.Arriba := Formulario1.Arriba+Form1.Altura;
si (Y-OldY > 10) o (Y-OldY < -10), entonces comience
PuedeMoveY := verdadero;
Form1.DockToForm: = Falso;
fin
si no, empezar
PuedeMoveY := Falso;
Form1.DockToForm: = Verdadero;
fin;
fin;
//Esta sección bloquea la lista de reproducción en el centro de Form1
if (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) y (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.Width div 2))+10) y
(Form2.Top > Form1.Top+Form1.Height-10) y (Form2.Top < Form1.Top+Form1.Height+10) luego
comenzar
Form2.Left := Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2));
si (X-OldX > 10) o (X-OldX < -10) o (Y-OldY > 10) o (Y-OldY < -10) entonces
CanMoveX: = verdadero
demás
CanMoveX := Falso;
fin;
fin;
fin;
procedimiento TForm2.FormMouseUp(Remitente: TObject; Botón: TMouseButton;Shift: TShiftState; X, Y: Entero);
comenzar
PuedeMoverse := false;
fin;
fin.
Espero que lo anterior sea útil para aquellos que tienen dificultades con contenido similar.