Thread, composants dynamiques, astuces de winform

Description

C'est un petit Soft qui permet d'obtenir un effet d'alpha sur des boutons. J'ai utiliser des thread pour réaliser l'effet et quelque petit manipulation d'évènements et de composants.

Pratique pour comprendre les thread et donc le multi-tâche ainsi que les objets dynamiques.

Source / Exemple :


// Source de la classe CreateButon

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsApplication1
{
    class CreateButton
    {
        private int Largeur; // Largeur Bouton
        private int Hauteur; // Hauteur Bouton
        private int PositionX; // Position de départ X du bouton
        private int PositionY; // Position de départ Y du bouton
        private int Espacement; // Espacement entre les boutons
        private int NombreDeBoutons; // Le nombre de boutons que l'on veut créer

        // L'effet est plus beau quand la couleur de fond et le blanc et
        // la couleur de fond de l'effet une couleur foncée
        private Color CouleurFond; // Couleur de fond de base du bouton
        private Color CouleurFondEffet; // Couleur de fond de l'effet du bouton
        private Color CouleurTexte; // Couleur du texte de base du bouton
        private Color CouleurTexteEffet; // Couleur du texte de l'effet du bouton

        private int VitesseEffet; // Vitesse de l'effet
        private int Decrement; // Le pas à pas de l'alpha

        string NomBouton; // Le nom du bouton
        string TexteBouton; // Le texte du bouton

        Form FormParent; // La form sur la quelle on veut afficher les boutons

        EventHandler CliqueSurBouton; // L'évènements des boutons

        public CreateButton(int largeur, int hauteur, int positionX, int positionY, int espacement, int nombreDeBoutons, Color couleurFond, Color couleurTexte, Color couleurFondEffet, Color couleurTexteEffet, int vitesseEffet, string nomBouton, string texteBouton, Form formulaireParent, EventHandler cliqueSurBouton)
        {
            // Récupération des paramètres du constructeur
            Largeur = largeur;
            Hauteur = hauteur;
            PositionX = positionX;
            PositionY = positionY;
            Espacement = espacement;
            CouleurFond = couleurFond;
            CouleurFondEffet = couleurFondEffet;
            CouleurTexte = couleurTexte;
            CouleurTexteEffet = couleurTexteEffet;
            VitesseEffet = vitesseEffet;
            Decrement = 30;
            NomBouton = nomBouton;
            TexteBouton = texteBouton;
            FormParent = formulaireParent;
            CliqueSurBouton = cliqueSurBouton;
            NombreDeBoutons = nombreDeBoutons;
        }
        public void Creer()
        {
            // On crée les boutons et on les ajoutes à la form qu'on
            // a passé en paramètres
            for (int i = 0; i < NombreDeBoutons; i++) 
            {
                Button LeBouton = new Button();
                LeBouton.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
                LeBouton.Size = new System.Drawing.Size(Largeur, Hauteur);
                LeBouton.Location = new System.Drawing.Point(PositionX, ((Hauteur + Espacement) * i) + PositionY);
                LeBouton.Name = NomBouton + i;
                LeBouton.TabIndex = 0;
                LeBouton.Text = TexteBouton + " " + (i + 1);
                LeBouton.BackColor = CouleurFond;
                LeBouton.ForeColor = CouleurTexte;
                LeBouton.MouseLeave += new System.EventHandler(this.button_MouseLeave);
                LeBouton.Click += new System.EventHandler(CliqueSurBouton);
                LeBouton.MouseEnter += new System.EventHandler(this.button_MouseEnter);
                FormParent.Controls.Add(LeBouton);
            }
        }
        private void button_MouseEnter(object sender, EventArgs e)
        {
            Button Bouton = (Button)sender; // On récupère le bouton
            ChangeAlpha(Bouton, 255); // Appel de la méthode qui permet de changer la couleur et l'alpha
            Bouton.ForeColor = CouleurTexteEffet; // On Change la couleur du texte du bouton
        }
        private void button_MouseLeave(object sender, EventArgs e)
        {
            Button btnSelect = (Button)sender; // On récupère le bouton
            // On instancie un nouveau thread pour pas freezer la form au
            // de l'application de l'effet.
            // ParameterizedThreadStart permet de passer un paramètre au moment
            // de l'appel de la méthide Start
            // Effet est la tâche que l'on veut appeler
            Thread tr = new Thread(new ParameterizedThreadStart(Effet));
            tr.Start(sender); // Appel de la tâche
        }
        private void Effet(object sender)
        {
            // sender est le paramètre que l'on passe. Dans notre cas
            // le bouton
            Button btnSelect = (Button)sender; // On récupère le bouton
            btnSelect.ForeColor = CouleurTexteEffet; // Change la couleur du texte
            for (int i = 255; i >= 0; i -= Decrement) // Boucle qui va décrémenter l'alpha
            {
                ChangeAlpha(btnSelect, i); // Appel de la méthode qui permet de changer la couleur et l'alpha
                Thread.Sleep(VitesseEffet); // On attend un petit coup
            }
            btnSelect.ForeColor = CouleurTexte; // On remet la bonne couleur de texte
            btnSelect.BackColor = CouleurFond; // On remet la bonne couleur de fond
        }
        private void ChangeAlpha(object sender, int alpha)
        {
            Button btnSelect = (Button)sender; // On récupère le bouton
            // On défini la nouvelle couleur avec l'alpha qui diminue
            btnSelect.BackColor = Color.FromArgb(alpha, CouleurFondEffet.R, CouleurFondEffet.G, CouleurFondEffet.B);
        }
    }
}

Conclusion :


L'effet n'est pas super si on bouge rapidement la souris. Si vous réussissez à l'optimiser je suis prenant.

Codes Sources

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.