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

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

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.