Procedura: creare Windows Form non rettangolari

In passato, la creazione di form non rettangolari era un'operazione elaborata e lunga che implicava chiamate di API e notevoli sforzi di programmazione. Questo tipo di operazione non è più così complesso.

Nota

Dato che questa operazione prevede una notevole elaborazione grafica da parte dei componenti hardware, le prestazioni del computer varieranno in base alla memoria e alle schede grafiche installate. Per le applicazioni che prevedono il disegno personalizzato, eseguire sempre test su varie schede video per assicurare prestazioni soddisfacenti prima della distribuzione agli utenti.

La creazione di form non rettangolari è costituita da due parti: la creazione del form con la forma desiderata e la creazione della logica di programmazione per consentire lo spostamento e la chiusura del form. Questa seconda fase è necessaria poiché un form con una forma personalizzata non ha barra del titolo e non dispone di funzionalità intrinseche, come la possibilità di spostamento sullo schermo e di chiusura. È pertanto necessario scrivere il codice appropriato per replicare queste funzionalità. Per ulteriori informazioni sulla creazione di form e controlli dalla forma non rettangolare, vedere Procedura: creare un Windows Form con una forma.

La creazione di un form non rettangolare è costituita da tre fasi:

  • Creare una bitmap con la funzione di superficie del form. Si tratta in effetti di ritagliare la forma desiderata da un rettangolo.

  • Creare un progetto di applicazione Windows e impostarne le proprietà in modo da eliminare la barra del titolo e utilizzare la bitmap come sfondo del form.

  • Immettere il codice per ricreare le funzionalità fornite dalla barra del titolo, ad esempio lo spostamento e la chiusura del form.

Nota

È possibile che le finestre di dialogo e i comandi di menu visualizzati siano diversi da quelli descritti nella Guida a seconda delle impostazioni attive o dell'edizione del programma. Per modificare le impostazioni, scegliere Importa/Esporta impostazioni dal menu Strumenti. Per ulteriori informazioni, vedere Gestione delle impostazioni.

Per creare un form con forma personalizzata

  1. Creare una bitmap di forma non rettangolare di un colore con uno sfondo in un altro colore. Utilizzare il programma di disegno desiderato. Poiché la forma disegnata corrisponderà al form, realizzare un disegno di dimensioni sufficientemente grandi.

    Nota

    Scegliere un colore di sfondo facile da ricordare, come il blu, poiché sarà importante in seguito.

  2. In Visual Studio creare un nuovo progetto Applicazione Windows. Per ulteriori informazioni, vedere Procedura: creare un nuovo progetto di applicazione Windows Form.

  3. Nella finestra Proprietà:

    • Impostare la proprietà FormBorderStyle su None.

      Viene rimossa la barra del titolo dal form. Vengono anche rimosse le funzionalità fornite dalla barra del titolo, come la possibilità di chiudere e di spostare il form. Questo problema verrà risolto nel codice in un secondo momento.

    • Impostare la proprietà BackgroundImage del form sul file bitmap creato in precedenza. Non occorre aggiungere il file al sistema del progetto, poiché questa operazione è automatica quando si specifica il file come immagine di sfondo.

      Con questa proprietà l'immagine bitmap viene impostata come sfondo del form. Quando la si utilizza con la proprietà TransparencyKey specificata di seguito, questa proprietà definisce la forma del form.

    • Impostare la proprietà TransparencyKey sul colore di sfondo del file bitmap.

      Con questa proprietà si segnala all'applicazione quali parti del form saranno trasparenti.

      Nota

      È possibile che sui monitor impostati con un'intensità colore superiore a 24 bit si presentino problemi di visualizzazione, con la conseguenza che determinate parti del form non appaiano trasparenti nonostante l'impostazione della proprietà TransparencyKey. Per evitare questo problema, accertarsi che l'intensità colore del monitor sia impostata su un valore inferiore a 24 bit nel pannello di controllo Schermo. Nello sviluppo di applicazioni che prevedono l'applicazione della trasparenza, è opportuno informare gli utenti in merito a questo inconveniente.

Per scrivere il codice per chiudere il form

  1. Aggiungere un controllo Button al form. Per ulteriori informazioni, vedere Procedura: aggiungere controlli a un Windows Form.

  2. Aggiungere codice per consentire all'utente di chiudere il form richiamando il metodo Close.

    Nell'esempio seguente viene illustrato come aggiungere un pulsante mediante la scelta del quale sia possibile chiudere il form.

    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 di C#Nota di C#

    Accertarsi di aggiungere codice per attivare il gestore eventi. Se si utilizza il codice dell'esempio seguente, il risultato sarà simile a quanto segue:

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

Per scrivere il codice per spostare il form (facoltativo)

  1. Creare una routine per spostare il form quando lo si trascina. Immettere codice simile a quello riportato di seguito per creare un nuovo oggetto Point. Questo codice avrà la funzione di una variabile quando si calcola come spostare il form. Il campo isMouseDown viene utilizzato per tenere traccia della pressione del pulsante del mouse. Il form verrà spostato solo mentre si tiene premuto il pulsante del mouse.

    Private mouseOffset As Point
    Private isMouseDown As Boolean = False
    
    private Point mouseOffset;
    private bool isMouseDown = false;
    
  2. Creare un gestore eventi per l'evento MouseDown del form. Aggiungere al gestore il codice per consentire a un utente di fare clic in un punto qualsiasi del form per trascinarlo. Per ulteriori informazioni sulla creazione di gestori eventi, vedere Procedura: creare le impostazioni delle applicazioni utilizzando la finestra di progettazione.

    Immettere codice simile a quello riportato di seguito per assegnare coordinate alla variabile mouseOffset sulla base della posizione corrente del puntatore del mouse. Nel codice che segue la posizione di offset viene calcolata mediante le informazioni di sistema relative alle dimensioni del bordo (FrameBorderSize.Width) e all'altezza della barra del titolo (CaptionHeight). È necessario tenere conto di tali informazioni quando si esegue il test dell'offset, poiché alcune misurazioni vengono effettuate con l'area client, altre con le coordinate dello schermo. L'offset pertanto equivale allo spessore del bordo più l'altezza della didascalia più l'offset nell'area client del form.

    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 di C#Nota di C#

    Accertarsi di aggiungere codice per attivare il gestore eventi. Se si utilizza il codice dell'esempio seguente, il risultato sarà simile a quanto segue:

    this.MouseDown += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseDown);
    
  3. Creare un gestore eventi per l'evento MouseMove del form.

    Immettere codice simile a quello riportato di seguito. Quando si fa clic sul pulsante sinistro e si trascina il mouse, la proprietà Location del form viene impostata sulla nuova posizione.

    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 di C#Nota di C#

    Accertarsi di aggiungere codice per attivare il gestore eventi. Se si utilizza il codice dell'esempio seguente, il risultato sarà simile a quanto segue:

    this.MouseMove += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseMove);
    
  4. Creare un gestore eventi per l'evento MouseUp del form. Immettere codice simile a quello riportato di seguito.

    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 di C#Nota di C#

    Accertarsi di aggiungere codice per attivare il gestore eventi. Se si utilizza il codice dell'esempio seguente, il risultato sarà simile a quanto segue:

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

Vedere anche

Attività

Procedura: creare un Windows Form con una forma

Procedura: creare Windows Form trasparenti

Riferimenti

Panoramica sui Windows Form