begin process at 2008 07 21 01:16:21
1 213 544 membres
13 nouveaux aujourd'hui
14 167 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RENDRE UNE FENETRE TRANSPARENTE EN CAS DE DÉPLACEMENT DE CELLE CI PAR L'UTILISATEUR


Information sur la source

Description

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

  • /// <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;
  • }
  • }
  • }
  • }
/// <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
  • signaler à un administrateur
    Commentaire de sebmafate le 29/08/2007 10:18:36 administrateur CS

    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.

  • signaler à un administrateur
    Commentaire de sephiro le 29/08/2007 10:47:59

    D'accord avec toi mais je n'ai pas voulu compliquer le code avec une gestion Hook, le timer étant actif quelques secondes.

  • signaler à un administrateur
    Commentaire de LoicBerthollet le 03/09/2007 12:10:20

    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) ?

  • signaler à un administrateur
    Commentaire de Pedrosa le 04/09/2007 13:23:43

    Bravo, très belle idée...
    Continue à nous faire des choses si sympa!

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS