Mover un formulario sin Barra de titulo

Descripción general

En ocasiones es (visualmente) interesante diseñar un formulario que no tenga bordes. En este caso el problema que aparece es que no podemos desplazar el formulario por la pantalla a una posición que nos sea mas cómoda para el trabajo.

[TOC] Tabla de Contenidos


↑↑↑

Mover un formulario sin Barra de titulo

La barra de título de un formulario tiene una serie de propiedades gráficas, entre la que se encuentra la de poder desplazar el formulario a la posición que nos interese en la pantalla. Si eliminamos esa barra de título [Ver Form.FormBorderStyle (Propiedad)], nos quedamos sin la posibilidad de mover el formulario por lo que tenemos que escribir el código adecuado para imitar esa habilidad.

Buscando por internet se encuentra, sobre todo, soluciones que recurren a llamadas a la API de Windows, pero como a mí no me gusta hacer esas llamadas, he seguido buscando hasta que he dado con una página de Microsoft en la que se describe Cómo: Crear formularios Windows Forms no rectangulares en la que de forma indirecta está resuelto este problema

El código que se muestra a continuación esta copiado de dicha dirección y mínimamente adaptado a lo que yo necesito

#Region "Para mover el Form con el boton izquierdo del mouse pulsado"

    '------------------------------------------------------------
    ' Codigo original en:
    ' Cómo: Crear formularios Windows Forms no rectangulares
    ' http://msdn.microsoft.com/es-es/library/6k15y9et(VS.80).aspx
    '--------------------------------------------------------------
    ' Tenga en cuenta que este proceso supone mucho procesamiento
    ' de gráficos para el hardware implicado; por tanto, el   
    ' rendimiento variará según la memoria y la tarjeta gráfica 
    ' de cada equipo.  
    ' Cuando las aplicaciones impliquen dibujos personalizados,  
    ' pruebe siempre con varias tarjetas de vídeo para garantizar  
    ' un rendimiento satisfactorio antes de facilitárselas 
    ' a los usuarios.
    '--------------------------------------------------------------

    '1 Crear un objeto Point nuevo que actuará como variable 
    '  cuando calcule cómo mover el formulario.  
    '  El campo isMouseDown se utiliza para controlar 
    '  si el usuario mantiene  presionado el botón del mouse.  
    '  El formulario debe moverse sólo cuando esté 
    ' presionado el botón del mouse. 

    Private _isMouseDown As Boolean = False
    Private _mouseOffset As Point = Nothing

    '--------------------------------------------------------------
    '2.Controlador de eventos para el evento MouseDown del formulario.  
    '  En el controlador, agregue código que permita al usuario 
    '  hacer clic en cualquier parte del formulario para arrastrarlo.  
    '  Escriba código para asignar coordenadas a la variable mouseOffset 
    '  en función de la posición actual del puntero del mouse.   
    '  En el siguiente código, observe que la posición de desplazamiento se   
    '  calcula utilizando información del sistema sobre el tamaño del   
    '  borde (FrameBorderSize.Width) y el alto de la barra de título (CaptionHeight).  
    '  Estas medidas se deben tener en cuenta cuando se pruebe el desplazamiento,   
    '  puesto que algunas medidas se realizan con el área cliente y otras con las   
    '  coordenadas de la pantalla. Por tanto, el desplazamiento es igual al ancho   
    '  del borde más el alto de la imagen más el desplazamiento 
    '  en el área cliente del formulario

    Private Sub Form1_MouseDown( _
                ByVal sender As Object, _
                ByVal e As MouseEventArgs) Handles MyBase.MouseDown

        Dim xOffset As Integer
        Dim yOffset As Integer

        If e.Button = MouseButtons.Left Then
            xOffset = -e.X - SystemInformation.FrameBorderSize.Width
            yOffset = -e.Y - SystemInformation.CaptionHeight - _
                      SystemInformation.FrameBorderSize.Height
            _mouseOffset = New Point(xOffset, yOffset)
            _isMouseDown = True
        End If

        ' cerrar el form pulsando el boton derecho del ratón
        If e.Button = MouseButtons.Right Then
            Me.Close()

        End If
    End Sub

    '3.Controlador de eventos para el evento MouseMove del formulario. 
    '  Cuando se hace clic con el   
    '  botón primario del mouse y se arrastra el mouse, la propiedad   
    '  Location del formulario se establece en la nueva posición. 


    Private Sub Form1_MouseMove( _
                ByVal sender As Object, _
                ByVal e As MouseEventArgs) Handles MyBase.MouseMove
        If _isMouseDown Then
            Dim mousePos As Point = Control.MousePosition
            mousePos.Offset(_mouseOffset.X, _mouseOffset.Y)
            Location = mousePos
        End If
    End Sub

    Private Sub Form1_MouseUp( _
                ByVal sender As Object, _
                ByVal e As MouseEventArgs) Handles MyBase.MouseUp
        ' Actualizar el valor de la variable [_isMouseDown] para que 
        ' el formulario solo se mueva cuando el usuario este 
        ' pulsando el boton izquierdo del ratón
        If e.Button = MouseButtons.Left Then
            _isMouseDown = False
        End If
    End Sub


#End Region

↑↑↑

A.2.Enlaces

[Para saber mas]
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]