2010-09-29 7 views
0

J'ai un formulaire où je veux des boutons tout en bas du formulaire, sans aucun écart par rapport à la bordure. Ces boutons doivent être "masquer automatiquement", de sorte qu'ils ne s'affichent que lorsque la souris se trouve par exemple dans les 20 pixels inférieurs du formulaire. Donc, j'utilise l'événement MouseMove pour déclencher cela, comme le code ci-dessous. Cependant, si la souris quitte la forme sur le bord inférieur, là où se trouvent les boutons, alors les boutons resteront évidemment. Mais je veux qu'ils se cachent. J'ai donc besoin à cet effet de cacher les boutons par un autre événement. Par conséquent, j'essaie de les cacher dans l'événement MouseLeave du formulaire. Mais cela rend les boutons invisibles et dans un état erratique, clignotant lorsque la souris passe sur le bouton .. Pourquoi est-ce? Et comment puis-je éviter ce problème pour obtenir une telle fonction d'autohide?Le bouton ne se cache pas lorsque la souris quitte le fond

Private Sub ZgScale_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove 

    If e.Y > Me.ClientSize.Height - 30 Then 
     Button1.Visible = True 
    Else 
     Button1.Visible = False 
    End If 
End Sub 

Private Sub ZgScale_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave 
    Button1.Visible = False 
End Sub 

Répondre

2

L'événement se déclenche MouseLeave lorsque la souris est plus directement sur que le contrôle (ou forme).
Si la souris passe à un contrôle enfant, l'événement se déclenchera.

Vous devez vérifier si la souris est plus sur la forme, comme ceci:

If Not Me.ClientRectangle.Contains(Me.PointToClient(e.Location)) Then 
    Button1.Visible = False 
End If 

EDIT: Correction

+0

hmm .. mais où mettre ce code? – bretddog

+0

@bretddog: Essayez-le maintenant. J'ai également vérifié par erreur le cadre de la fenêtre. – SLaks

+0

Merci .. Je pense que le problème est que l'événement MouseMove ne se déclenche pas lorsque la souris quitte le formulaire .. Alors, où puis-je mettre votre code? – bretddog

1

Windows a un soutien direct pour ce scénario intégré. Également exposé dans Windows Forms et WPF. Une fois que vous obtenez l'événement MouseMove, définissez la propriété Capture sur le contrôle sur True. Cela force tous les messages de la souris à être dirigés vers le contrôle, même si la souris se déplace en dehors de la fenêtre de contrôle. Une fois que vous le voyez se déplacer en dehors des limites de contrôle, définissez Retour à false et masquer votre contrôle. Méfiez-vous que la capture est désactivée lorsque l'utilisateur clique sur la souris, vous devrez donc probablement le rallumer par la suite. Bien que cela devrait être automatique, vous obtiendrez un autre événement MouseMove. Pourrait échouer si l'utilisateur déplace la souris vraiment rapidement.

+0

Intéressant .. Si je comprends bien je devrais laisser la forme ou le contrôle sous-jacent capturer la souris, au lieu des boutons (?) Je vois .. Mais alors que faire si je fais défiler la souris sur un bouton, sera le bouton obtenir cet événement de la souris? – bretddog

+0

Oh .. ce n'est pas un événement de bouton .. désolé. mais par exemple un événement mouseLeave du bouton. Je ne comprendrai pas avec cette solution? Parce que j'ai besoin de faire quelque chose sur un tel événement. Comme changer la couleur du bouton. – bretddog

+0

Il devient trouble lorsque vous avez plusieurs contrôles que vous voulez faire disparaître.Coordonner leurs événements MouseEnter/Leave ne fonctionne pas, il est toujours vaincu par l'utilisateur en déplaçant la souris très rapidement. La souris est échantillonnée, elle ne fournit pas un flux continu de positions de pixels. La seule vraie solution est alors d'utiliser une minuterie, 200 msec est correct, et regardez la Mouse.Position. Vous aurez besoin de Control.PointToClient. –

Questions connexes