2008-12-07 6 views
4

J'ai un mouseenter et un événement mouseleave pour un contrôle Panel qui modifie la couleur de fond lorsque la souris entre et revient au blanc quand elle part.Contrôles personnalisés dans la question d'événement souris Windows Forms C#

J'ai également un contrôle Label dans ce panneau, mais lorsque la souris entre dans le contrôle Label, l'événement mouseleave du panneau se déclenche.

Cela a du sens, mais comment conserver la couleur de fond du panneau lorsque la souris est dans sa zone sans que les autres contrôles à l'intérieur l'affectent?

Répondre

4

Vous pouvez utiliser GetChildAtPoint() pour déterminer si la souris survole un contrôle enfant.

private void panel1_MouseLeave(object sender, EventArgs e) 
{ 
    if (panel1.GetChildAtPoint(panel1.PointToClient(MousePosition)) == null) 
    { 
     panel1.BackColor = Color.Gray; 
    } 
} 

Si le contrôle n'est pas réellement un contrôle enfant, vous pouvez toujours utiliser MousePosition et PointToScreen pour déterminer si la souris est toujours dans les limites du contrôle.

private void panel1_MouseLeave(object sender, EventArgs e) 
{ 
    Rectangle screenBounds = new Rectangle(this.PointToScreen(panel1.Location), panel1.Size); 
    if (!screenBounds.Contains(MousePosition)) 
    { 
     panel1.BackColor = Color.Gray; 
    } 
} 
0

Vous pouvez ajouter un événement MouseEnter pour l'étiquette qui définit également la couleur de fond du panneau. Vous n'auriez pas besoin d'un événement MouseLeave pour l'étiquette.

Ou:

  1. Définir l'événement MouseEnter pour le Groupe spécial de définir la couleur dos du panneau.
  2. Définissez l'événement MouseEnter du contrôle parent du Panel (par exemple, Form) pour réinitialiser la couleur de fond du Panel.

Si vous vouliez faire le point 2 ci-dessus sans toucher le code de contrôle parent (selon le commentaire d'autres utilisateurs), vous pouvez faire quelque chose comme ça dans l'événement ParentChanged du Panel:

private void panel1_ParentChanged(object sender, EventArgs e) 
    { 
     Panel thisPanel = sender as Panel; 

     if(thisPanel != null && thisPanel.Parent != null) 
     { 
      thisPanel.Parent.MouseEnter += delegate(object senderObj, EventArgs eArgs) { thisPanel.BackColor = SystemColors.Control; }; 
     } 
    } 
1

L'ajout d'un événement pour un contrôle contenu signifie que lorsque vous voulez ajouter un autre contrôle au panneau, vous devez faire le même exercice pour cela. Ajouter un événement pour le contrôle parent signifie que dès que vous voulez utiliser le panneau ailleurs, vous devez faire la même chose pour le nouveau parent. Et lorsque les exigences du panneau changent, vous devez vous souvenir de retirer le traitement de l'événement du contrôle parent.

Tous potentiellement en désordre un peu plus loin dans la ligne. Je serais enclin à mettre un contrôle de coordonnées dans l'événement de souris pour le panneau, et seulement réinitialiser la couleur du panneau si la souris est vraiment allée en dehors des limites du panneau. De cette façon, votre code pour la gestion des panneaux reste uniquement sur le panneau en question.

1

J'ai trouvé une solution simple. Je viens de définir la propriété enabled à false sur l'étiquette et ça va.

+3

... tout ira bien jusqu'à ce que vous vouliez un contrôle activé sur votre panneau :) – ChrisA

+0

Belle solution simple! M'a aidé avec mon cas spécifique aussi. Ce serait bien s'il y avait un moyen de configurer le contrôle parent pour prévisualiser les événements de la souris, avant qu'ils ne soient envoyés aux contrôles enfants, cependant. – Andy