Rendre une fenetre transparente en cas de déplacement de celle ci par l'utilisateur

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 209 fois - Téléchargée 17 fois

Contenu du snippet

Lorsque que l'on déplace une fenetre c'est souvant pour voir ce qu'il y a en dessous, mais où que l'on pose la fenetre elle cache quelque chose. Cette class permet de rendre partiellement transparente une fenetre pendant le temps du déplacement, elle redevient opaque si on la lache.
Cette fonction est totallement inutile donc indispensable.

Comment l'utiliser:
Copier le code de la class dans votre projet, puis dans la class de votre fenetre créé la class
private _Cls_ScreenOpac ClsScreen = new _Cls_ScreenOpac();
puis dans la fonction _Load de votre fenetre initialiser la class avec le pointeur de votre fenetre
ClsScreen.MaFenetre = this;

Comment ça marche:
Au moment où l'on initialise le pointeur de la fenetre, je détourne l'evenement LocationChanged pour détecter le déplacement de la fenetre, un Timer est créé dans la Class pour gérer l'evolution de la transparence ou de l'opacité.
Toute les X ms la fonction Gestion_Affichage regarde si le bouton de la souris est enfoncé si oui la fenetre est toujours en mouvement donc je fais évoluer ça transparence jusqu'a 40%, si le bouton n'est plus enfoncé j'inverse le processus pour rendre la fenetre opaque je coupe le timer apres 95%.

Amusez vous bien
Sephiro

Source / Exemple :


/// <summary>
    /// Class permettant de rendre transparente (partiellement)
    /// une fenetre en cas de déplacement de celle ci.
    /// </summary>
    public class _Cls_ScreenOpac
    {
        private  Form Ptr_Screen = null; // ----- Pointeur sur la fenetre à géré
        private System.Windows.Forms.Timer Timer_Opacity; // ----- Creation d'une variable de type  Timer
        private int Sens = 0; // ----- Sens du mouvement opaque si Positif devient transparent si négatif devient opaque
        public Form MaFenetre {
            get {return Ptr_Screen;}
            set {
                Ptr_Screen = value;
                // ----- Détourner l'evenement "Location Change" c'est à dire que la fenetre est en mouvement
                Ptr_Screen.LocationChanged += new System.EventHandler(this.MoveScreen);
                // ----- Creation d'un Timer pour la gestion
                // ----- de la transparence progressive.
                Timer_Opacity = new System.Windows.Forms.Timer();
                Timer_Opacity.Interval = 50; // ----- 0.1 seconde par defaut
                Timer_Opacity.Enabled = false; // ----- Non actif pour le moment
                Timer_Opacity.Tick += new EventHandler(Gestion_Affichage); // ----- Fonction executé par le timer
           
            }
        }
        private void Gestion_Affichage(object sender, EventArgs e)
        {
            if (Ptr_Screen == null)
                return;
            // ----- Etat du bouton
            MouseButtons mbs = Control.MouseButtons;
            if ((mbs & MouseButtons.Left) == 0) // ----- Le bouton est relaché
               Sens = -1;
            // ----- Partiellement transparent
            if ((Ptr_Screen.Opacity < 0.4f) && (Sens >0)) 
               return;
           // ----- Totallement opaque  
            if ((Ptr_Screen.Opacity > 0.95f)&& (Sens <0))
                {
                    Timer_Opacity.Enabled = false; // ----- Stop le timer
                    Ptr_Screen.Opacity = 1;
                    return;
                }   
            Ptr_Screen.Opacity = Ptr_Screen.Opacity - (0.1f * Sens);
            return;
        }
        private void MoveScreen(object sender, EventArgs e)
        {
            // ----- le bouton gauche est cliqué
            MouseButtons mbs = Control.MouseButtons;
            if ((mbs & MouseButtons.Left) != 0)
            {// ----- Le mouvement de la fenetre est en cours et la souris a le bouton gauche actif
                if (Timer_Opacity.Enabled == false)
                { // -----Si le Timer n'est pas actif
                    Timer_Opacity.Enabled = true;
                    Sens = 1;
                }
            }
        }
    }

Conclusion :


Je n'ai pas mis de projet pour 20 lignes de code dans une Class, mais si le besoin s'en fait sentir je l'ajouterai, je ne parviens pas à faire une capture ecran avec la transparence, si j'y parviens j'ajouterai une image

A voir également

Ajouter un commentaire

Commentaires

nicotie
Messages postés
10
Date d'inscription
mercredi 17 mars 2010
Statut
Membre
Dernière intervention
29 juillet 2010

enorme, ca marche impec! merci
cs_Pedrosa
Messages postés
43
Date d'inscription
lundi 3 juillet 2006
Statut
Membre
Dernière intervention
2 juin 2008

Bravo, très belle idée...
Continue à nous faire des choses si sympa!
LoicBerthollet
Messages postés
1
Date d'inscription
lundi 3 septembre 2007
Statut
Membre
Dernière intervention
3 septembre 2007

Bonjour.
Tout d'abord bravo pour cette source simple et du plus bel effet.

Petite question quand même : quand on attache un gestionnaire d'évènement localisé dans une classe externe de la classe qui génère l'évènement, il me semble avoir lu quelque part, qu'il fallait absolument détacher le gestionnaire manuellement pour ne pas grignoter des ressources (le ramasse miette ne peut plus ramasser) ?
cs_sephiro
Messages postés
101
Date d'inscription
dimanche 1 avril 2001
Statut
Membre
Dernière intervention
18 février 2008

D'accord avec toi mais je n'ai pas voulu compliquer le code avec une gestion Hook, le timer étant actif quelques secondes.
sebmafate
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
Idée intéressante... mais je ne suis pas pour l'utilisation d'un Timer. J'aurais préféré un hook... c'est plus solide et moins consommateur de ressource.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.