Share via


Comment : créer des Windows Forms non rectangulaires

Mise à jour : novembre 2007

Auparavant, la création de formulaires non rectangulaires était un processus long et fastidieux qui impliquait des appels API et un gros travail de programmation. Ce n'est désormais plus le cas.

Remarque :

Ce processus représente un énorme travail de traitement graphique pour le matériel utilisé ; par conséquent, les ordinateurs réagiront différemment en fonction des cartes mémoire et des cartes graphiques dont ils disposent. Lorsque les applications incluent des dessins personnalisés, testez toujours différentes cartes vidéo afin de garantir un niveau de performances approprié avant de les déployer aux utilisateurs.

Le processus de création de formulaires non rectangulaires comporte deux aspects : la création du formulaire avec la forme souhaitée et le codage de la logique de programmation pour permettre le déplacement et la fermeture du formulaire. Cette seconde étape est indispensable, car un formulaire ayant une forme personnalisée n'a pas de barre de titre ni aucune de ses fonctionnalités inhérentes, comme la possibilité de déplacer le formulaire à l'écran et de le fermer. Par conséquent, il est nécessaire d'écrire un code pour répliquer ces fonctionnalités. Pour plus d'informations sur la création de formulaires et de contrôles de formes non rectangulaires, consultez Comment : créer un Windows Form mis en forme.

La création d'un formulaire non rectangulaire se décompose en trois étapes :

  • Création d'une bitmap qui deviendra la surface du formulaire. (En fait, vous allez « découper » la forme de formulaire souhaitée à partir d'un rectangle.)

  • Création d'un projet d'application Windows et définition de ses propriétés pour supprimer la barre de titre et utiliser la bitmap comme arrière-plan du formulaire.

  • Saisie du code qui recrée les fonctionnalités fournies par la barre de titre, par exemple le déplacement et la fermeture du formulaire.

Remarque :

Les boîtes de dialogue et les commandes de menu que vous voyez peuvent différer de celles qui sont décrites dans l'aide selon vos paramètres actifs ou votre édition. Pour modifier vos paramètres, choisissez Importation et exportation de paramètres dans le menu Outils. Pour plus d'informations, consultez Paramètres Visual Studio.

Pour créer un formulaire avec une forme spécifique

  1. Créez une bitmap non rectangulaire d'une couleur donnée avec un arrière-plan distinct d'une autre couleur. Utilisez le programme de dessin de votre choix. La forme que vous dessinez deviendra votre formulaire. Veillez donc à la dessiner suffisamment grande pour qu'elle puisse être utilisable.

    Remarque :

    Choisissez une couleur d'arrière-plan facile à mémoriser, telle que le bleu, car ce détail sera très important par la suite.

  2. Créez un projet d'application Windows dans Visual Studio. Pour plus d'informations, consultez Comment : créer un projet d'application Windows.

  3. Dans la fenêtre Propriétés :

    • Affectez à la propriété FormBorderStyle la valeur Aucun.

      Cette propriété supprime la barre de titre du formulaire. (Elle supprime également les fonctionnalités fournies par la barre de titre, notamment la possibilité de déplacer et de fermer le formulaire. Ce problème est toutefois résolu dans le code ci-dessous.)

    • Définissez la propriété BackgroundImage du formulaire à l'aide du fichier bitmap que vous avez créé précédemment. Vous n'avez pas besoin d'ajouter le fichier au système de projet ; il sera ajouté automatiquement lorsque vous le désignerez comme image d'arrière-plan.

      Cette propriété définit l'image bitmap comme image d'arrière-plan du formulaire. (Lorsqu'elle est utilisée conjointement avec la propriété TransparencyKey spécifiée ci-dessous, cette propriété définit la forme du formulaire.)

    • Affectez à la propriété TransparencyKey la couleur d'arrière-plan du fichier bitmap.

      Cette propriété indique à l'application les parties du formulaire qui seront transparentes.

      Remarque :

      Les moniteurs paramétrés sur une profondeur de couleur supérieure à 24 bits peuvent rencontrer des problèmes d'affichage avec certaines parties du formulaire non transparentes, malgré le paramètre défini pour la propriété TransparencyKey. Pour éviter ce problème, cliquez sur Affichage dans le Panneau de configuration et assurez-vous que la profondeur de couleur du moniteur est définie sur une valeur inférieure à 24 bits. Si vous développez des applications incluant cette fonction de transparence, gardez à l'esprit que vous devez informer les utilisateurs de ce problème.

Pour écrire du code pour fermer le formulaire

  1. Ajoutez un contrôle Button au formulaire. Pour plus d'informations, consultez Comment : ajouter des contrôles à des Windows Forms.

  2. Ajoutez le code qui permettra de fermer le formulaire en appelant sa méthode Close.

    L'exemple suivant montre comment ajouter un bouton qui ferme le formulaire lorsque l'utilisateur clique dessus.

    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();
    }
    
    Remarque pour C# :

    Veillez à ajouter du code afin d'activer le gestionnaire d'événements. En utilisant le code de l'exemple suivant, il se présente comme suit :

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

Pour écrire du code pour déplacer le formulaire (facultatif)

  1. Créez une procédure pour déplacer le formulaire lorsque l'utilisateur le fait glisser. Entrez du code semblable au code ci-dessous pour créer un nouvel objet Point. Cet objet jouera le rôle de variable lorsque vous analyserez la façon de déplacer le formulaire. Le champ isMouseDown permet de savoir si le bouton de la souris est enfoncé ou non. Le formulaire ne doit se déplacer que si le bouton de la souris est enfoncé.

    Private mouseOffset As Point
    Private isMouseDown As Boolean = False
    
    private Point mouseOffset;
    private bool isMouseDown = false;
    
  2. Créez un gestionnaire d'événements pour l'événement MouseDown du formulaire. Dans le gestionnaire, ajoutez le code permettant à l'utilisateur de cliquer n'importe où sur le formulaire pour le faire glisser. Pour plus d'informations sur la création de gestionnaires d'événements, consultez Comment : créer des gestionnaires d'événements à l'aide du concepteur.

    Entrez du code similaire au code ci-dessous pour assigner des coordonnées à la variable mouseOffset , basées sur la position actuelle du pointeur de la souris. Dans le code ci-dessous, remarquez que la position offset est calculée à l'aide des informations système relatives à la taille de la bordure (FrameBorderSize.Width) et à la hauteur de la barre de titre (CaptionHeight). Ces informations doivent être prises en compte lors du test de l'offset, car certaines mesures sont effectuées avec la zone cliente, et d'autres, avec les coordonnées de l'écran. Par conséquent, l'offset est égal à la somme de la largeur de la bordure, de la hauteur de la légende et de l'offset dans la zone cliente du formulaire.

    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;
        }    
    }
    
    Remarque pour C# :

    Veillez à ajouter du code afin d'activer le gestionnaire d'événements. En utilisant le code de l'exemple suivant, il se présente comme suit :

    this.MouseDown += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseDown);
    
  3. Créez un gestionnaire d'événements pour l'événement MouseMove du formulaire.

    Entrez du code semblable au code ci-dessous. Lorsque l'utilisateur clique sur le bouton gauche et fait glisser la souris, la nouvelle position apparaît dans la propriété Location du formulaire.

    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;
        }
    }
    
    Remarque pour C# :

    Veillez à ajouter du code afin d'activer le gestionnaire d'événements. En utilisant le code de l'exemple suivant, il se présente comme suit :

    this.MouseMove += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseMove);
    
  4. Créez un gestionnaire d'événements pour l'événement MouseUp du formulaire. Entrez du code semblable au code ci-dessous.

    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;
        }
    }
    

Voir aussi

Tâches

Comment : créer un Windows Form mis en forme

Comment : créer des Windows Forms transparents

Référence

Vue d'ensemble des Windows Forms