¿Hay alguna manera de hacer que un formulario que no tiene borde (FormBorderStyle se establece en "ninguno") se pueda mover cuando se hace clic con el mouse en el formulario como si hubiera un borde?
109
Este artículo sobre CodeProject detalla una técnica. Básicamente se reduce a:
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool ReleaseCapture();
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
Básicamente, esto hace exactamente lo mismo que agarrar la barra de título de una ventana, desde el punto de vista del administrador de ventanas.
Form1_MouseDown
que no está asignado alMouseDown
evento real deForm1
.this.MouseDown += ...
a laMain()
función para el formularioNo hagamos las cosas más difíciles de lo necesario. Me he encontrado con tantos fragmentos de código que le permiten arrastrar un formulario (u otro Control). Y muchos de ellos tienen sus propios inconvenientes / efectos secundarios. Especialmente aquellos en los que engañan a Windows para que piense que un Control en un formulario es el formulario real.
Dicho esto, aquí está mi fragmento. Lo uso todo el tiempo. También me gustaría señalar que no debería usar this.Invalidate (); como a otros les gusta hacer porque hace que el formulario parpadee en algunos casos. Y en algunos casos también lo hace esto. Usando this.Update, no he tenido ningún problema de parpadeo:
fuente
Otra forma más sencilla de hacer lo mismo.
fuente
utilice MouseDown, MouseMove y MouseUp. Puede establecer una bandera de variable para eso. Tengo una muestra, pero creo que debes revisarla.
Estoy codificando la acción del mouse en un panel. Una vez que haga clic en el panel, su formulario se moverá con él.
fuente
Solo WPF
no tengo el código exacto a mano, pero en un proyecto reciente creo que usé el evento MouseDown y simplemente puse esto:
Método Window.DragMove (MSDN)
fuente
Árbitro. enlace de video
Esto está probado y es fácil de entender.
fuente
WM_NCHITTEST
disfrazado.No hay propiedad que puedas voltear para que esto suceda por arte de magia. Mire los eventos del formulario y se vuelve bastante trivial implementar esto configurando
this.Top
ythis.Left
. Específicamente usted quiere mirarMouseDown
,MouseUp
yMouseMove
.fuente
esto puede resolver tu problema ...
fuente
https://social.msdn.microsoft.com/Forums/vstudio/en-US/d803d869-68e6-46ff-9ff1-fabf78d6393c/how-to-make-a-borderless-form-in-c?forum=csharpgeneral
Este fragmento de código del enlace anterior funcionó en mi caso :)
fuente
La mejor forma que he encontrado (modificado por supuesto)
Para aplicar arrastre a un control, simplemente inserte esto después de InitializeComponent ()
fuente
Funcionó para mí.
fuente
Para .NET Framework 4,
Puede usar
this.DragMove()
para elMouseDown
evento del componente (mainLayout en este ejemplo) que está usando para arrastrar.fuente
La forma más sencilla es:
Primero cree una etiqueta llamada label1. Vaya a los eventos de label1> eventos del mouse> Label1_Mouse Move y escriba estos:
fuente
Estaba tratando de hacer que un formulario de ventanas sin bordes se pudiera mover y que contuviera un control WPF Element Host y un control de usuario WPF.
Terminé con un panel de pila llamado StackPanel en mi control de usuario de WPF, que parecía lo lógico para intentar hacer clic para mover. Probar el código de junmats funcionó cuando moví el mouse lentamente, pero si lo movía más rápido, el mouse se saldría del formulario y el formulario se atascaría en algún lugar a la mitad del movimiento.
Esto mejoró su respuesta para mi situación usando CaptureMouse y ReleaseCaptureMouse y ahora el mouse no se mueve fuera del formulario mientras lo muevo, incluso si lo muevo rápidamente.
fuente
Dado que algunas respuestas no permiten que los controles secundarios se puedan arrastrar, he creado una pequeña clase de ayuda. Debe pasar el formulario de nivel superior. Puede hacerse más genérico si se desea.
fuente
Además, si necesita hacer DoubleClick y hacer que su formulario sea más grande o más pequeño, puede usar la Primera respuesta, crear una variable int global, agregar 1 cada vez que el usuario haga clic en el componente que usa para arrastrar. Si,
variable == 2
entonces haz tu forma más grande / más pequeña. También use un temporizador por cada medio segundo o un segundo para hacer suvariable = 0
;fuente
Agregar un
MouseLeftButtonDown
controlador de eventos a MainWindow funcionó para mí.En el caso de que la función de evento se genere automáticamente, agregue el siguiente código:
fuente
Estoy expandiendo la solución de jay_t55 con un método más
ToolStrip1_MouseLeave
que maneja el evento de que el mouse se mueva rápidamente y abandone la región.fuente
Probé lo siguiente y listo, ¡mi ventana transparente ya no estaba congelada en su lugar, pero se podía mover! (deseche todas esas otras soluciones complejas anteriores ...)
fuente
Formulario 1():
new Moveable(control1, control2, control3);
Clase:
fuente
fuente