Thread, composants dynamiques, astuces de winform

Soyez le premier à donner votre avis sur cette source.

Vue 11 273 fois - Téléchargée 862 fois

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

Ajouter un commentaire

Commentaires

Utilisateur anonyme
Oui ça peut être pas mal ça.
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
6
Ou bien alors tu ajoute une propriété de déphasage sur ton bouton, et lorsque l'utilisateur les crée, il configure ce déphasage comme il le veut.
Le bouton s'anime en suite selon un temps de référence (DateTime.Now par exemple) + le déphasage.
Utilisateur anonyme
Ouai c'est vrai. Bon je pense que après libre à n'importe qui de faire n'importe quoi.
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Ben pour moi chaque bouton peut être autonome : lorsqu'il perd le focus, tu lance l'effet graphique (peut importe qu'il y ai d'autres boutons ou pas)
Utilisateur anonyme
Ouai t'as raison un bouton avec déjà toutes ces options ce serait super. J'y avais pas penser. Merci pour le conseil. T'aurais gérer comment l'effet entre plusieurs bouton ? Parce que l'effet dépend d'un certain nombre de boutons donc il y aurait fallut ajouter du code dans le formulaire, pas super. Tu vois une autre technique ???
Afficher les 6 commentaires

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.