Como: Criar formulários do Windows não-retangulares

Anteriormente, a criação de formulários não retangulares era um processo demorado e trabalhoso envolvendo chamadas de API e esforços amplos de programação. Este não é mais o caso.

ObservaçãoObservação

Esse processo envolve uma grande quantidade de processamento gráfico para o hardware envolvido; como resultado, os computadores terão performances diferentes dependendo da memória e da placa de vídeo presentes. Quando aplicativos envolvem desenho personalizado, sempre teste em uma variedade de placas de vídeo para assegurar o desempenho satisfatório antes de distribuir para usuários.

O processo de criação de formulários não-retangulares possui dois elementos: Criando o formulário moldado e codificação de alguma programação lógica para permitir que o formulário seja movido e fechada. Esta segunda etapa é necessária porque um formulário com uma forma personalizada não tem barra de título e nenhuma da funcionalidade inerente a ela, como a capacidade de mover o formulário pela tela e fechá-lo. Portanto, é necessário escrever código para replicar estes recursos. Para mais informações sobre como criar os formulários e controles com formas não retangulares, consulte Como: Criar um formulário do Windows moldado.

Criar um formulário não retangulares consiste em três etapas:

  • Crie um bitmap que atuará como superfície do formulário. (Na verdade, você "cortará" a forma desejada do formulário a partir de um retângulo.)

  • Crie um projeto do de Aplicativo do Windows e defina suas propriedades para eliminar a barra de título e usar o bitmap como plano de fundo do formulário.

  • Insira código que recria a funcionalidade que a barra de título fornecia, como mover o formulário e fechá-lo.

ObservaçãoObservação

As caixas de diálogo e comandos de menu demonstradas podem ser diferentes daqueles descritos na Ajuda, dependendo das configurações ativas ou configurações de edição. Para alterar as configurações, escolha Import and Export Settings sobre o Ferramentas menu. Para obter mais informações, consulte Trabalhando com configurações.

Para criar um formulário moldado

  1. Crie um bitmap com uma forma não retangular de uma cor e um plano de fundo distinto de outra cor. Use qualquer programa de desenho desejado. A forma que você desenhar será por fim o seu formulário; portanto, certifique-se de desenhá-la grande o suficiente para ser útil.

    ObservaçãoObservação

    Escolha uma cor do plano de fundo fácil de lembrar, como azul, pois isto será importante no futuro.

  2. No Visual Studio, crie um novo projeto de Aplicativo do Windows. Para obter mais informações, consulte Como: Crie um novo projeto de aplicativo do Windows Forms.

  3. Na janela Propriedades:

    • Defina a propriedade FormBorderStyle como None.

      Essa propriedade remove a barra de título do formulário. (Ela também remove a funcionalidade que é fornecida pela barra de título, incluindo a capacidade de fechar e mover o formulário. No entanto, este empecilho é abordada abaixo no código.)

    • Defina a propriedade BackgroundImage do formulário para o arquivo de bitmap que você criou anteriormente. Não é preciso adicionar o arquivo ao sistema do projeto; isso será feito automaticamente quando você especifica-lo como imagem de plano de fundo.

      Esta propriedade define a imagem de bitmap como plano de fundo do formulário. (Quando usado em conjunto com a propriedade TransparencyKey especificada abaixo, essa propriedade define a forma do formulário.)

    • Defina a propriedade TransparencyKey para o cor do plano de fundo do arquivo de bitmap.

      Essa propriedade informa o aplicativo que partes do formulário que você deseja que tornem-se transparentes.

      ObservaçãoObservação

      Monitores definidos para uma intensidade de cor de maior que 24 bits podem ter problemas de exibição com determinadas partes do formulário não sendo transparentes, apesar da definição da propriedade TransparencyKey. Para evitar esse problema, verifique se a profundidade de cor do monitor está definida para menos de 24 bits em Display (Vídeo) no Painel de Controle Ao desenvolver aplicativos que apresentam essa transparência, tenha em mente que você precisará tornar seus usuários cientes desse problema.

Para escrever código para fechar o formulário

  1. Adicione um controle Button ao formulário. Para obter mais informações, consulte Como: Adicionar controles Windows Forms.

  2. Adicione um código que permitirá que o usuário feche o formulário por chamando seu método Close.

    O exemplo a seguir mostra como você pode adicionar um botão que, quando clicado, irá fechar o formulário.

    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();
    }
    
    Observação sobre o C#Observação sobre o C#

    Não se esqueça de adicionar código para habilitar o manipulador de eventos. Usando o código exemplo a seguir, ele teria a aparência de:

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

Para escrever código para mover o formulário (opcional)

  1. Crie um procedimento para mover o formulário quando ele é arrastado. Insera código semelhante ao seguinte para criar um novo objeto Point. Isso funcionará como uma variável quando você calcular como mover o formulário. O campo isMouseDown é usado para controlar se o usuário está segurando o botão do mouse. O formulário deve mover apenas enquanto o mouse for mantido pressionado.

    Private mouseOffset As Point
    Private isMouseDown As Boolean = False
    
    private Point mouseOffset;
    private bool isMouseDown = false;
    
  2. Crie um manipulador de eventos para o evento MouseDown do formulário. No manipulador, adicione um código que permite que um usuário clique em qualquer lugar no formulário para arrastá-lo. Para obter detalhes sobre como criar manipuladores de eventos, consulte Como: Criar manipuladores de eventos usando o Designer.

    Insera código semelhante ao seguinte para atribuir coordenadas a variável mouseOffset com base na posição atual da ponteiro do mouse. No código a seguir, observe que a posição de deslocamento é calculada usando informações do sistema sobre o tamanho da borda (FrameBorderSize.Width) e altura da barra de título (CaptionHeight). Eles devem ser levados em consideração ao testar o deslocamento, porque algumas medidas são feitas com a área cliente e alguns são feitas com coordenadas de tela. Assim, o deslocamento é igual a largura da borda mais a altura da barra de título mais o deslocamento na área cliente do formulário.

    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;
        }    
    }
    
    Observação sobre o C#Observação sobre o C#

    Não se esqueça de adicionar código para habilitar o manipulador de eventos. Usando o código exemplo a seguir, ele teria a aparência de:

    this.MouseDown += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseDown);
    
  3. Crie um manipulador de eventos para o evento MouseMove do formulário.

    Insera código semelhante ao seguinte. Quando o botão do esquerdo mouse é clicado e o mouse é arrastado, o a propriedade Location do formulário é definida como a nova posição.

    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;
        }
    }
    
    Observação sobre o C#Observação sobre o C#

    Não se esqueça de adicionar código para habilitar o manipulador de eventos. Usando o código exemplo a seguir, ele teria a aparência de:

    this.MouseMove += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseMove);
    
  4. Crie um manipulador de eventos para o evento MouseUp do formulário. Insera código semelhante ao seguinte.

    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;
        }
    }
    
    Observação sobre o C#Observação sobre o C#

    Não se esqueça de adicionar código para habilitar o manipulador de eventos. Usando o código exemplo a seguir, ele teria a aparência de:

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

Consulte também

Tarefas

Como: Criar um formulário do Windows moldado

Como: Criar formulários do Windows transparentes

Referência

Visão Geral dos Formulários do Windows