begin process at 2012 02 13 03:24:35
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Formulaire

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

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


 Information sur la source

Note :
Aucune note
Catégorie :Formulaire Source .NET ( DotNet ) Classé sous :Transparence, Opacité, Opacity, MouseLeave Niveau :Débutant Date de création :25/04/2009 Vu / téléchargé :4 273 / 443

Auteur : Arnal88

Ecrire un message privé
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

 Description

Vous connaissez certainement le logiciel de retouche Paint.net
Les boîtes à outils sont translucides, et deviennent opaques lorsque la souris passe dessus.
J'ai voulu recréer cet effet pour mon programme de cinétique chimique.

On se dit que c'est évident : il suffit de modifier la propriété Opacity de la form.
C'est ce que fait la première partie de ma source : à l'événement MouseEnter, on rend le formulaire opaque, et on le rend translucide lorsque la souris le quitte (événement MouseLeave).

Problème : lorsque la souris passe sur un contrôle (un bouton par exemple), cela déclenche l'événement MouseLeave !


J'ai trouvé une solution sur un forum anglophone, je la partage avec cette source.
J'utilise un Timer qui teste toutes les 100ms si la souris est au dessus du formulaire.
On fait ce test comme ceci :
   If Me.ClientRectangle.Contains(PointToClient(Control. MousePosition)) = True Then .....

Et ça fonctionne !

J'en ai profité pour faire un effet de fondu lorsque la souris quitte le formulaire (on décrémente progressivement l'opacité)


Dernière remarque : pour ne pas avoir d'effet de "clignottement" noir, il faut mettre la propriété TransparencyKey sur une autre couleur que Transparent. Prenez une couleur qui n'apparaît pas, par exemple Fushia...


 Conclusion

Cette source est rapide, c'est juste pour illustrer la méthode expliquée précédemment.

J'espère qu'elle pourra être utile à quelqu'un...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) COMPOSANT GRAPHE
Source avec Zip Source avec une capture Source .NET (Dotnet) RÉSOLUTION DE L'ÉQUATION DE LA CHALEUR
Source avec Zip Source avec une capture Source .NET (Dotnet) CHIMIE : SIMULATION DE RÉACTION

 Sources de la même categorie

Source avec Zip GEST COTISATION - ASSOCIATION par MOHA555
Source avec Zip HSCROLLBAR POUR L'ARRIÈRE PLAN par 320C
Source avec Zip Source avec une capture Source .NET (Dotnet) METTRE VOTRE FORM VB.NET EN PLEINE ÉCRAN par Gabilach
RECHERCHE DANS UNE LISTE À PARTIR D'UN CHAMP TEXTE par jmeunier
Source avec Zip GESTION DES COMSOMMABLE par gboraud

 Sources en rapport avec celle ci

Source avec Zip MESSAGE AUTO (MSG_AUTO) par omega8
Source avec Zip Source avec une capture ALARMA! - TRANSPARENCE, ZONE DE NOTIFICATION par killerkurgan
Source avec Zip Source avec une capture CLSWIDGET = UNE CLASS POUR FAIRE UN WIDGET AVEC INFOBULLE E... par Philippe734
Source avec Zip Source avec une capture EFFETS DE FONDU ANIMÉS (TRANSPARENCE/OPACITÉ) SUR LES FENÊTR... par MadM@tt
Source avec Zip OPACITÉ D'UNE FENETRE: LA RENDRE TRANSPARENTE par Tilois

Commentaires et avis

Commentaire de Kite37 le 25/04/2009 21:45:50

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.

Commentaire de Kite37 le 25/04/2009 21:49:06

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.

Commentaire de Kite37 le 25/04/2009 21:53:08

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 -_-'

Commentaire de Arnal88 le 25/04/2009 22:12:09

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...

Commentaire de Kite37 le 25/04/2009 22:21:11

dans ce cas pourquoi ne pas régler cela sur les événements mouseEnter/Leave de la picturebox? plus besoin de timer comme ça.

Commentaire de Arnal88 le 25/04/2009 23:02:37

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...

Commentaire de Kite37 le 25/04/2009 23:30: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 ^^

Commentaire de Arnal88 le 25/04/2009 23:51:57

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 !

Commentaire de tadamob le 11/10/2011 21:31:05

En tout les cas gros merci à toi :p

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Transparence & Opacité [ par kahlouni ] Comment faire pour une Transparence &amp; Opacit&#233; dans une image en utilisant un timer ?*un exemple si possible Comment récupérer la transparence d'une image ??? [ par nicobru ] Bonjour, Je cherche &#224; d&#233;composer une image photoshop en deux couches : une contenant les couleurs, et une contenant la transparence (et en f Comment récupérer la transparence d'une image ??? [ par nicobru ] Bonjour, Je cherche &#224; d&#233;composer une image photoshop en deux couches : une contenant les couleurs, et une contenant la transparence (et en f transparence [ par BZY1 ] Salut tout le monde est ce que quelqu'un sait si on peut faire la transparence avec VB6? transparence [ par BasicInstinct ] 'lutcomment transformer une couleur d'une picturebox en transparent ???l'api TransparentBlt a besoin d'une destination differente de la source, sinon Transparence connectes [ par tison06 ] Salut a tous j'ai trouve une source sur un site"Teamspeak" que j'ai transforme mais le probleme et qu' il y a une transparence sur les pseudo des conn Transparence ! [ par tison06 ] Salut a tous j'ai trouve une source sur un site"Teamspeak" que j'ai transforme mais le probleme et qu' il y a une transparence sur les pseudo des conn


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales