MODIFIER L'OPACITÉ D'UN FORMULAIRE AU PASSAGE DE LA SOURIS

cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018 - 25 avril 2009 à 21:45
tadamob Messages postés 4 Date d'inscription mardi 12 juillet 2011 Statut Membre Dernière intervention 1 janvier 2012 - 11 oct. 2011 à 21:31
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/49913-modifier-l-opacite-d-un-formulaire-au-passage-de-la-souris

tadamob Messages postés 4 Date d'inscription mardi 12 juillet 2011 Statut Membre Dernière intervention 1 janvier 2012 2
11 oct. 2011 à 21:31
En tout les cas gros merci à toi :p
Arnal88 Messages postés 96 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
25 avril 2009 à 23:51
Je suis d'accord, c'est mieux si on peut s'en passer.
Dans le cas de ma source, avec uniquement un bouton au milieu, ta méthode est meilleure.

Par contre, je ne vois pas d'utilisation particulière du CPU à cause du Timer. L'utilisation du processeur par le processus reste imperturbablement à 0%, même lorsque je bouge la souris par dessus la fenêtre...

J'ai utilisé un timer pour que ça fonctionne en toute circonstances.

Mais bon, libre à chacun d'adapter son code !
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
25 avril 2009 à 23:30
Et bien personnellement je préfère toujours essayer de me passer des timers pour rendre le code 100% événementiel dans les programmes de ce genre.

Ce sont surtout des habitudes de programmation, bien que l'on puisse malgré tout reprocher aux timers de bouffer pas mal de CPU ^^
Arnal88 Messages postés 96 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
25 avril 2009 à 23:02
Oui, d'accord... Mais si il y a encore d'autres contrôles ?
Le Timer a l'avantage de fonctionner tout le temps.

C'est si grave d'avoir mis un Timer ?? ;-)
A te lire j'ai l'impression que tu veux absolument t'en débarasser...
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
25 avril 2009 à 22:21
dans ce cas pourquoi ne pas régler cela sur les événements mouseEnter/Leave de la picturebox? plus besoin de timer comme ça.
Arnal88 Messages postés 96 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
25 avril 2009 à 22:12
Merci pour ton commentaire.

Effectivement, l'événement MouseLeave se produit lorsqu'on quitte la zone cliente... donc si on pointe une bordure la fenêtre redevient transparente. Je n'ai pas trouvé de solution à cela.
Prendre en compte les bordures (ton 1er message) est envisageable, mais je ne sais pas comment récupérer leurs dimensions. (on ne peut pas coder ces valeurs "en dur" comme tu as fait)

Concernant le Timer, je vais m'expliquer :
Ici, effectivement c'est un peu bourrin ;-)

Sauf que pour mon programme de cinétique chimique, j'ai une Form qui contient uniquement une PictureBox sur presque toute sa surface.
Si ma Form fait 100 de large, ma PictureBox en fait par exemple 92. C'est à dire que la zone cliente de la Form est à peine visible (seulement 4 pixels de chaque côté).
Lorsque la souris passe trop vite, elle arrive directement sur la PictureBox, donc ne déclenche ni l'événement MouseEnter ni l'événement MouseLeave !

C'est pour ça que j'ai choisi de mettre un Timer, qui lui fonctionne quoi qu'il arrive...
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
25 avril 2009 à 21:53
hmm en fait je n'ai rien dis les deux méthodes rendent pareil au final vu que le mouseLeave ne se fait exclusivement que lorsque l'on quitte la zone client -_-'
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
25 avril 2009 à 21:49
désolé double post j'ai oublié ceci :

Il y a sinon une autre méthode :

Private Sub Form1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
Me.Opacity = 1
End Sub

Private Sub Form1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
Dim pt As Point = MousePosition

If Not Me.ClientRectangle.Contains(PointToClient(Control.MousePosition)) Then
Me.Opacity = 0.1
End If
End Sub

Qui marche très bien et sans timer, le seul problème étant de nouveau la gestion des bordures. (en effet la form devient transparente lorsque l'on pointe les bordures .. gênant)

Cordialement,

KiTe.
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
25 avril 2009 à 21:45
utiliser un timer est peut être un peu bourrin pour faire ça.

Le problème reste surtout que le mouseLeave est généré dès que l'on quitte non pas la form mais l'espace conteneur de la form.

Or, sur les forms il y a une bordure assez gênante dans la mesure ou l'on n'a aucune variable/méthode/propriétés membre de la permettant d'obtenir la valeur de celle ci (que se soit la barre en haut ou les bordures sur les côtés), et que celle-ci ne sont pas prises en compte dans le mouseLeave.

La méthode que je présente ici n'est pas universelle et doit être réadaptée en fonction du formBorderStyle (et peut être de l'OS car je ne sais pas si avec les derniers SP les GUI générés sur XP sont les mêmes de base que sur vista) :

/!\ Ici pour formBorderStyle = sizable : /!\

Private Sub Form1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
Me.Opacity = 1
End Sub

Private Sub Form1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
Dim pt As Point = MousePosition

If (pt.X - Me.Location.X <= 10) Or (pt.X - Me.Location.X >= (Me.Width - 10)) Or (pt.Y - Me.Location.Y <= 30) Or (pt.Y - Me.Location.Y >= Me.Height - 10) Then
Me.Opacity = 0.1
End If
End Sub

Les bordures bas, gauche et droite font a peu près 10px de large, et la barre en haut 30px.
Via des énumérations et des constantes on peut plus facilement gérer les modification de formBorderStyle et donc les différentes largeurs de bordures (à déterminer soit même) pour rendre ce morceau de code plus général.

Donc préférer des variables constantes ou énumérations pour éviter les 10 et 30 baladeurs et rendre le code un peu plus utilisable. Bref les bases sont là.

Cordialement,

KiTe.
Rejoignez-nous