Compartir a través de


Cómo: Crear formularios Windows Forms no rectangulares

Antes, la creación de formularios no rectangulares era un proceso que requería mucho trabajo y tiempo, y que implicaba llamadas a API y grandes esfuerzos de programación. Pero esto ya no es así.

Nota

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.

El proceso de creación de formularios no rectangulares tiene dos elementos: creación de un formulario con forma y codificación de lógica de programación para poder mover y cerrar el formulario. El segundo paso es necesario porque un formulario con una forma personalizada no tiene barra de título ni la funcionalidad inherente a ella, como la capacidad de mover el formulario en la pantalla y cerrarlo. Por tanto, es necesario escribir código para replicar estas características. Para obtener más información sobre cómo crear los formularios y controlar formas no rectangulares, vea Cómo: Crear un formulario Windows Forms con forma.

La creación de un formulario no rectangular consta de tres pasos:

  • Cree un mapa de bits que actuará como superficie del formulario. En realidad, "recortará" la forma deseada del formulario a partir de un rectángulo.

  • Cree un proyecto de aplicación para Windows y defina sus propiedades para eliminar la barra de título y utilizar el mapa de bits como fondo para el formulario.

  • Escriba el código que crea de nuevo la funcionalidad de la barra de título, como mover el formulario y cerrarlo.

Nota

Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valores de configuración o de edición activos. Para cambiar la configuración, elija la opción Importar y exportar configuraciones del menú Herramientas. Para obtener más información, vea Trabajar con valores de configuración.

Para crear un formulario con forma

  1. Cree un mapa de bits de una forma no rectangular de un color con un fondo en otro color. Utilice cualquier programa de dibujo. La forma que dibuje será finalmente el formulario, así que asegúrese de dibujarla con un tamaño que resulte útil.

    Nota

    Elija un color de fondo fácil de recordar, como azul, porque esto será importante más adelante.

  2. En Visual Studio, cree un proyecto nuevo de aplicación para Windows. Para obtener más información, vea Cómo: Crear un nuevo proyecto de aplicación de Windows Forms.

  3. En la ventana Propiedades:

    • Defina la propiedad FormBorderStyle como None.

      Esta propiedad quita la barra de título del formulario. También quita la funcionalidad que proporciona una barra de título, como la capacidad para mover o cerrar el formulario. Sin embargo, este problema se soluciona en el código más adelante.

    • Defina la propiedad BackgroundImage del formulario como el archivo de bits que creó antes. No es necesario agregar el archivo al sistema del proyecto; esto se hará automáticamente cuando lo especifique como imagen de fondo.

      Esta propiedad define la imagen de mapa de bits como el fondo del formulario. Cuando se utiliza en un tándem con la propiedad TransparencyKey especificada a continuación, esta propiedad define la forma del formulario.

    • Defina la propiedad TransparencyKey como el color de fondo del archivo de mapa de bits.

      Esta propiedad indica a la aplicación las partes del formulario que desea ver.

      Nota

      Los monitores con una profundidad de color superior a 24 bits pueden tener problemas para mostrar determinadas partes del formulario que no sean transparentes, incluso si se configura la propiedad TransparencyKey. Para evitar este problema, asegúrese de que la profundidad de color del monitor está establecida en menos de 24 bits en el panel de control Pantalla. Cuando desarrolle aplicaciones que utilicen esta transparencia, tenga en cuenta que deberá advertir a los usuarios de este problema.

Para escribir código para cerrar el formulario

  1. Agregue un control Button al formulario. Para obtener más información, vea Cómo: Agregar controles a formularios Windows Forms.

  2. Agregue código que permitirá al usuario cerrar el formulario invocando a su método Close.

    El siguiente ejemplo muestra cómo puede agregar un botón que, al hacer clic en él, cierre el formulario.

    Private Sub Button1_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles Button1.Click
       Me.Close()
    End Sub
    
    private void button1_Click(object sender, System.EventArgs e)
    {
       this.Close();
    }
    
    Nota para C#Nota para C#

    Asegúrese de agregar código para habilitar el controlador de eventos. Si utiliza el código del siguiente ejemplo, tendrá el siguiente aspecto:

    this.Button1.Click += new System.EventHandler(this.button1_Click);
    

Para escribir código para mover el formulario (opcional)

  1. Cree un procedimiento para mover el formulario cuando sea arrastrado. Escriba código similar al siguiente para crear un objeto Point nuevo. Esto 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 mouseOffset As Point
    Private isMouseDown As Boolean = False
    
    private Point mouseOffset;
    private bool isMouseDown = false;
    
  2. Cree un 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. Para obtener información detallada acerca de cómo crear controladores de eventos, vea Cómo: Crear controladores de eventos con el diseñador.

    Escriba código similar al siguiente 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
    End Sub
    
    private void Form1_MouseDown(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {
        int xOffset;
        int yOffset;
    
        if (e.Button == MouseButtons.Left) 
        {
            xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
            yOffset = -e.Y - SystemInformation.CaptionHeight - 
                SystemInformation.FrameBorderSize.Height;
            mouseOffset = new Point(xOffset, yOffset);
            isMouseDown = true;
        }    
    }
    
    Nota para C#Nota para C#

    Asegúrese de agregar código para habilitar el controlador de eventos. Si utiliza el código del siguiente ejemplo, tendrá el siguiente aspecto:

    this.MouseDown += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseDown);
    
  3. Cree un controlador de eventos para el evento MouseMove del formulario.

    Escriba código similar al siguiente. 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 void Form1_MouseMove(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {
        if (isMouseDown) 
        {
            Point mousePos = Control.MousePosition;
            mousePos.Offset(mouseOffset.X, mouseOffset.Y);
            Location = mousePos;
        }
    }
    
    Nota para C#Nota para C#

    Asegúrese de agregar código para habilitar el controlador de eventos. Si utiliza el código del siguiente ejemplo, tendrá el siguiente aspecto:

    this.MouseMove += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseMove);
    
  4. Cree un controlador de eventos para el evento MouseUp del formulario. Escriba código similar al siguiente.

    Private Sub Form1_MouseUp(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseUp
        ' Changes the isMouseDown field so that the form does
        ' not move unless the user is pressing the left mouse button.
        If e.Button = MouseButtons.Left Then
            isMouseDown = False
        End If
    End Sub
    
    private void Form1_MouseUp(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {
        // Changes the isMouseDown field so that the form does
        // not move unless the user is pressing the left mouse button.
        if (e.Button == MouseButtons.Left) 
        {
            isMouseDown = false;
        }
    }
    
    Nota para C#Nota para C#

    Asegúrese de agregar código para habilitar el controlador de eventos. Si utiliza el código del siguiente ejemplo, tendrá el siguiente aspecto:

    this.MouseUp += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseUp);
    

Vea también

Tareas

Cómo: Crear un formulario Windows Forms con forma

Cómo: Crear formularios Windows Forms transparentes

Referencia

Información general sobre formularios Windows Forms