IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Déplacement d'une Form sans bordure ?


Sujet :

Windows Forms

  1. #1
    Membre confirmé Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 411
    Points : 465
    Points
    465
    Par défaut Déplacement d'une Form sans bordure ?
    Bonjour,

    Je n'arrive pas à déplacer ma form (FormBorderStyle = None) avec la souris exactement comme n'importe quel logiciel ou fenêtre sous Windows.

    Le problème ne se produit qu'une fois, au tout premier déplacement de la souris pendant que mon bouton gauche est donc enfonçé. Le coin supérieur gauche de la Form vient se coller aux coordonnées de la souris. Toujours sans relacher le bouton de la souris, le reste du déplacement se déroule normalement.

    Vu mon code, je comprends pourquoi cela se produit, mais je ne sais pas comment faire pour remédier à ce petit problème. De plus, des paramètres aléatoires sont sans doute à prendre en compte (positionnement de la souris sur la forme au moment du clique et sense de déplacement de la Form)

    Ma procédure de déplacement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Sub Software_Deplacement(ByVal sender As System.Object, ByVal e As MouseEventArgs) Handles MyBase.MouseMove
            If e.Button = Windows.Forms.MouseButtons.Left Then
                Me.Location = New System.Drawing.Point(MousePosition.X, MousePosition.Y)
            End If
        End Sub
    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Voici le code que j'utilise pour déplacer une fenêtre (grâce à un label qui fait office de barre de titres)
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
            Point src;
            bool inMove = false;
            checkMoveArea = false;//ou true en fonction de ce qu'on veut
     
            public virtual bool InMove
            {
                get { return inMove; }
            }
     
            bool canMove = true;
     
            public virtual bool CanMove
            {
                get { return canMove; }
                set { canMove = value; }
            }
     
            private void CaptionLabel_MouseDown(object sender, MouseEventArgs e)
            {
     
                if (canMove)
                    inMove = true;
     
                src = e.Location;
            }
     
            private void CaptionLabel_MouseMove(object sender, MouseEventArgs e)
            {
                if (inMove)
                {
                    if (checkMoveArea && (Left + (e.X - src.X)) < 0)
                        Left = 0;
                    else if (checkMoveArea && (Left + (e.X - src.X)) + Width > Screen.PrimaryScreen.WorkingArea.Width)
                        Left = Screen.PrimaryScreen.WorkingArea.Width - Width;
                    else
                    {
                        Left += e.X - src.X;
                    }
     
                    if (checkMoveArea && (Top + e.Y - src.Y) < 0)
                        Top = 0;
                    else if (checkMoveArea && (Top + e.Y - src.Y) + Height > Screen.PrimaryScreen.WorkingArea.Height)
                        Top = Screen.PrimaryScreen.WorkingArea.Height - Height;
                    else
                    {
                        Top += e.Y - src.Y;
                    }
     
                    checkPosition();
                }
            }
     
            private void checkPosition()
            {
                Rectangle w_area = Screen.GetWorkingArea(this);
                if (Top > w_area.Height - TitleBar.Height)
                    Top = w_area.Height - TitleBar.Height;
            }
     
            private void CaptionLabel_MouseUp(object sender, MouseEventArgs e)
            {
                inMove = false;
            }

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Je rappelle que la souris n'est pas forcément cliquée à la coordonnée (0,0) de la fenêtre et qu'il faut donc prendre en considération la marge entre le haut et la gauche au départ, c'est pour cela que dans mon code je fais ceci :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    Left += e.X - src.X;
    Et d'ailleurs j'ai encore oublié de vérifier que j'étais bien dans la section C# et pas VB.Net ... mais l'idée est celle ci : au click, on sauvegarde la position de départ afin de pouvoir considérer que la souris est à la position (x,y) et non pas la ramener à (0,0) ce qui a pour conséquence de glisser la fenêtre pour que la souris soit effectivement à la position (0,0)

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je préfère la version wpf (qui ne convient pas dans ton cas arnomedia)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private sub (...) handles me.mousedown
        me.Dragmove
    end sub
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    je préfère la version wpf (qui ne convient pas dans ton cas arnomedia)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private sub (...) handles me.mousedown
        me.Dragmove
    end sub
    Moi aussi... c'est pour ça que je l'ai implémenté pour Windows Forms, avec quelques améliorations par rapport à la version WPF
    http://tomlev.wordpress.com/2009/04/...que-controles/

  6. #6
    Membre confirmé Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 411
    Points : 465
    Points
    465
    Par défaut
    Merci à vous tous. Vos extraits de code m'ont permis de trouver une solution toute simple

    J'ai tout de m amélioré le rendu dans mon programme en créant un Panel qui me sert de barre de titre, merci smyley pour l'astuce

    Exemple de code en VB.NET :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        Public Class Form1
            Dim myMouseLocation As System.Drawing.Point
     
            Private Sub Software_Moving_Start(ByVal sender As System.Object, ByVal e As MouseEventArgs) Handles MyBase.MouseDown
     
                myMouseLocation = e.Location 'recup de la position initiale du curseur de la souris
            End Sub
     
            Private Sub Software_Moving(ByVal sender As System.Object, ByVal e As MouseEventArgs) Handles MyBase.MouseMove
     
                If e.Button = Windows.Forms.MouseButtons.Left Then
                    Me.Location = New System.Drawing.Point(MousePosition.X - myMouseLocation.X, MousePosition.Y - myMouseLocation.Y)
                End If
            End Sub
        End Class
    Si quelqu'un a plus simple, qu'il n'hésite pas à le dire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aucun SystemMenu avec une Form sans bordure. Comment faire ?
    Par arnofly dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/06/2009, 15h11
  2. Déplacement d'une fenêtre sans bordure
    Par Saintux dans le forum wxPython
    Réponses: 4
    Dernier message: 13/06/2009, 07h25
  3. Resize d'une form sans bordure
    Par Papy214 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/05/2008, 15h13
  4. Une Form sans bordure mais redimensionnable
    Par kanzarih dans le forum Débuter
    Réponses: 2
    Dernier message: 29/04/2008, 21h23
  5. Deplacement d'une Form sans bordures
    Par blondelle dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/11/2007, 22h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo