2011-09-22 3 views
1

Ma forme hiérarchie est quelque chose comme ceci:méthode GetChildAtPoint retourne le mauvais contrôle

Form -> TableLayoutOne -> TableLayoutTwo -> Panel -> ListBox 

En cas MouseMove de la zone de liste, j'ai le code comme ceci:

Point cursosPosition2 = PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y)); 
    Control crp = this.GetChildAtPoint(cursosPosition2); 
    if (crp != null) 
     MessageBox.Show(crp.Name); 

Le MessageBox montre moi "TableLayoutOne", mais je m'attends à ce qu'il me montre "ListBox". Où est-ce que je me trompe dans mon code? Merci.

Répondre

5

La méthode GetChildFromPoint() utilise la méthode ChildWindowFromPointEx() native, dont les états documents:

Détermine, le cas échéant, des fenêtres enfants appartenant à la fenêtre parent spécifié contient le point spécifié. La fonction peut ignorer les fenêtres enfants invisibles, désactivées et transparentes. La recherche est limitée aux fenêtres enfants immédiates. Les descendants et les petits-enfants ne sont pas recherchés.

Notez le texte en gras: la méthode ne peut pas obtenir ce que vous voulez.

En théorie, vous pouvez appeler GetChildFromPoint() sur le contrôle retourné jusqu'à ce que vous avez null:

Control crp = this.GetChildAtPoint(cursosPosition2); 
Control lastCrp = crp; 

while (crp != null) 
{ 
    lastCrp = crp; 
    crp = crp.GetChildAtPoint(cursorPosition2); 
} 

Et alors vous sauriez que lastCrp était le plus bas descendant à cette position.

+0

Dang! Merci pour info ... avez-vous d'autres idées sur la façon de l'obtenir? peut-être lire l'emplacement du curseur et vérifier s'il est à l'intérieur de l'emplacement de ListBox? – Bohn

+1

Voir ma mise à jour; vous pouvez continuer à appeler 'GetChildAtPoint()' sur le contrôle retourné pour aller plus loin dans la hiérarchie. Vous êtes également libre de vérifier le type de contrôle à chaque étape, afin que vous puissiez renflouer si vous avez trouvé ce que vous cherchiez. – dlev

Questions connexes