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 :

[VB.NET][Treeview] lancer ItemDrag, meme si click en dehors du bound [FAQ]


Sujet :

Windows Forms

  1. #1
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut [VB.NET][Treeview] lancer ItemDrag, meme si click en dehors du bound
    Bonjour,

    ItemDrag ne se déclenche que lorsqu'on commence à faire un Drag& drop en ayant cliqué sur la zone de texte du noeud.

    Je voudrais qu'il se déclenche aussi lorsqu'on commence à faire un drag& drop en ayant cliqué sur toute la ligne de ce noeud. (je surcharge le DrawItem, donc ce qui s'affiche sur le noeud n'est pas ce qui est contenu dans Text)

    Je ne sais pas trop comment m'y prendre.

    (Je ne souhaite pas faire un DoDragDrop() sur un OnMouseDown, ca n'a pas exactement le même comportement qu'un ItemDrag)

    D'avance merci

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Mmmmh
    Il me semble donc que tu as developpé ton propre TreeView, si c'est le cas il faudrait que sa méthode GetNodeAt soit en mesure d'extrapoler si le Point spécifié correspond à un TreeNode voisin. Ce qui necessite tout de même que tu te tapes un algorithme de calcul qui serait capable de fournir un nouveau point(x,y) appartenant ou pas à coup sûr à un rectangle connu du TreeView.
    Si cela te semble la bonne piste, tu pourrais aboutir à quelquechose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function GetNodeAt(ByVal x As Integer, ByVal y As Integer) As TreeNode
          Dim newPoint As Point
          '... ici le calcul qui détermine le nouveau point translaté
          Return MyBase.GetNodeAt(newPoint)
    End Function
    Maintenant
    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
    16
     
    Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
          MyBase.OnMouseDown(e)
          'histoire de ne pas faire de doublon
          If (MyBase.GetNodeAt(e.X,e.Y) Is Nothing)
             'verifier si çà ne correspond pas à un point voisin
             Dim tn As TreeNode = Me.GetNodeAt(e.X,e.Y)
             'si c'est ok declencher itemdrag
             If Not(tn Is Nothing) Then
                 Dim itemArgs As New ItemDragEventArgs()
                 itemArgs.Button = e.Button
                 itemArgs.Item = tn
                 MyBase.OnItemDrag(itemArgs)
             End If
          End If
    End Sub

  3. #3
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Disons que mon propre treeview que j'avais surchargé était destiné à un autre usage. Mais bon, visiblement je ne peux pas échapper à la surcharge.

    Maintenant dans ton code, je ne comprends pas bien, car si lancement de ItemDrag il y a, tu le fais dans MouseDown, or le vrai ItemDrag ne se déclenche qu'au bout d'un certain temps (ou distance, justement je ne sais pas) de mousemove apres avoir enfoncé le bouton droit.

    Donc si je doit hériter mon control, je pense que le mieux est de me baser sur une histoire de distance en pixel par rapport au point de mousedown, mais y-a-t-il des subtilités ? (genre comment déterminer la distance optimum, est-ce que cette distance doit changer en fonction de la taille des fonts choisies par l'utilisateur etc...)

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 100
    Points
    100
    Par défaut
    genre comment déterminer la distance optimum
    Tu peux utiliser la propriété SystemInformation.DragSize pour ça...

  5. #5
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Ahh yes, merci !!

    J'essaye de coder ca ce soir, et je vois si il y a d'autres subtilités qui se profilent

  6. #6
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    voila,

    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
    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
        public class TreeViewDrag : TreeView
        {
            private TreeNode m_draggedNode      = null;
            private Point    m_downPoint        = Point.Empty;
            private int      m_systemDragWith   = SystemInformation.DragSize.Width;
            private int      m_systemDragHeight = SystemInformation.DragSize.Height;
     
            protected override void OnMouseDown(MouseEventArgs e)
            {
                base.OnMouseDown(e);
     
                m_downPoint = e.Location;
     
                m_draggedNode = GetNodeAt(m_downPoint);
            }
     
            protected override void OnMouseMove(MouseEventArgs e)
            {
                base.OnMouseMove(e);
     
                if (m_draggedNode == null || e.Button == MouseButtons.None) return;
     
                int l_measuredDragWidth    = e.X-m_downPoint.X;
                int l_measuredDragHeight   = e.Y-m_downPoint.Y;
     
                double l_systemDragLength  = Math.Sqrt(m_systemDragWith * m_systemDragWith + m_systemDragHeight * m_systemDragHeight);
                double l_mesuredDragLength = Math.Sqrt(l_measuredDragWidth * l_measuredDragWidth + l_measuredDragHeight * l_measuredDragHeight);
     
                if (l_mesuredDragLength >= l_systemDragLength)
                {              
                    base.OnItemDrag(new ItemDragEventArgs(e.Button, m_draggedNode)); 
                }
            }
     
            protected override void OnMouseUp(MouseEventArgs e)
            {
                base.OnMouseUp(e);
     
                m_downPoint = Point.Empty;
                m_draggedNode = null;
            }
        }
    Si vous avez des idées pour l'optimiser, n'hésitez pas.
    Sinon => FAQ.

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

Discussions similaires

  1. [VB.net][treeview] Sélectionner un Node via click droit
    Par arnolem dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/03/2006, 11h45
  2. [VB.NET] TreeView
    Par bloody22 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 11/07/2005, 15h57
  3. [VB.NET] [TreeView] expand node d'un treeview
    Par graphicsxp dans le forum Windows Forms
    Réponses: 3
    Dernier message: 07/04/2005, 16h21
  4. [VB.NET] Treeview creer dynamiquement a partir d'une bd
    Par graphicsxp dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/03/2005, 17h02

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