Magazine Internet

[GDI] Un petit dégradé style Vista

Publié le 12 mars 2009 par Jeremy.jeanson

Fan de GDI+ depuis la première heure, j’ai sous la main un certain nombre de codes très sympathique. Je vous propose ici de partager l’un de mes favoris, le dégrader façon Vista (à la mode depuis quelques années sur toute interface qui se veut un peu sexy)

Avant de donner le code, voici le genre de rendu que peut permettre cette méthode.

screenshot-couleurs-GDI

Et le code qui permet de dessiner le dégradé de fond :

Cette méthode prend quatre arguments :

  1. Le Graphics sur lequel on dessine.
  2. La zone (Rectangle) dans laquelle on va dessine.
  3. La Couleur à dessiner.
  4. Eventuellement le tracé d’un masque (GraphicsPAth) si on veut remplir une forme un peut particulière et nom pas un simple rectangle.

Et pour ne fâcher personne, voici les 2 versions du code (Vb et C#)

Vb

        ''' <summary>
        ''' Fond type Aéro glass
        ''' </summary>
        ''' <param name="vG"></param>
        ''' <param name="vRect"></param>
        ''' <param name="vColor"></param>
        ''' <param name="vMasque"></param>
        Public Sub PaintBackAeroGlass(ByVal graphics As Graphics,ByVal zone As Rectangle, ByVal couleur As Color, ByVal masque As GraphicsPath)
            Dim Int_Heiht As Int32 
            Dim rect1, rect2 As Rectangle

            Dim brush1 As LinearGradientBrush = Nothing
            Dim brush2 As LinearGradientBrush = Nothing

            Try
                Int_Heiht = Convert.ToInt32(zone.Height / 2)
                rect1 = New Rectangle(zone.X, zone.Y, zone.Width, Int_Heiht)
                rect2 = New Rectangle(zone.X, zone.Y + Int_Heiht, zone.Width, zone.Height - Int_Heiht)

                brush1 = New LinearGradientBrush( _
                    rect1, _
                    Color.FromArgb(50, couleur), _
                    Color.FromArgb(160, couleur), _
                    LinearGradientMode.Vertical)

                brush2 = New LinearGradientBrush( _
                    rect2, _
                    Color.FromArgb(190, couleur), _
                    Color.FromArgb(210, couleur), _
                    LinearGradientMode.Vertical)

                ' Paint des 2 rect
                If masque Is Nothing Then

                    ' sans masque
                    graphics.FillRectangle(new SolidBrush(Color.White), zone)
                    graphics.FillRectangle(brush1, rect1)
                    graphics.FillRectangle(brush2, rect2)

                Else

                    Region r = null
                    Try
                        ' Avec masque
                        graphics.FillPath(New SolidBrush(Color.White), masque)

                        r = New Region(masque)
                        r.Intersect(rect1)
                        graphics.FillRegion(brush1, r)

                        r = New Region(masque)
                        r.Intersect(rect2)
                        graphics.FillRegion(brush2, r)

                    Finally

                        //Libération mémoire
                        if (r != null) r.Dispose();
                        r = null;
                    End Try
                End If

            Catch

            Finally
                if brush1 IsNot Nothing Then brush1.Dispose()
                brush1 = Nothing
                if brush2 IsNot Nothing Then brush2.Dispose()
                brush2 = Nothing
            End Try
        End Sub

C#

        /// <summary>
        /// Fond type Aéro glass
        /// </summary>
        /// <param name="vG"></param>
        /// <param name="vRect"></param>
        /// <param name="vColor"></param>
        /// <param name="vMasque"></param>
        private void PaintBackAeroGlass(Graphics graphics, Rectangle zone, Color couleur, GraphicsPath masque)
        {
            Int32 Int_Heiht;
            Rectangle rect1, rect2;

            LinearGradientBrush
                brush1 = null,
                brush2 = null;

            try
            {
                Int_Heiht = Convert.ToInt32(zone.Height / 2);
                rect1 = new Rectangle(zone.X, zone.Y, zone.Width, Int_Heiht);
                rect2 = new Rectangle(zone.X, zone.Y + Int_Heiht, zone.Width, zone.Height - Int_Heiht);

                brush1 = new LinearGradientBrush(
                    rect1,
                    Color.FromArgb(50, couleur),
                    Color.FromArgb(160, couleur),
                    LinearGradientMode.Vertical);

                brush2 = new LinearGradientBrush(
                    rect2,
                    Color.FromArgb(190, couleur),
                    Color.FromArgb(210, couleur),
                    LinearGradientMode.Vertical);

                //Paint des 2 rect
                if (masque == null)
                {
                    //sans masque
                    graphics.FillRectangle(new SolidBrush(Color.White), zone);
                    graphics.FillRectangle(brush1, rect1);
                    graphics.FillRectangle(brush2, rect2);
                }
                else
                {
                    Region r = null;
                    try
                    {
                        //Avec masque
                        graphics.FillPath(new SolidBrush(Color.White), masque);

                        r = new Region(masque);
                        r.Intersect(rect1);
                        graphics.FillRegion(brush1, r);

                        r = new Region(masque);
                        r.Intersect(rect2);
                        graphics.FillRegion(brush2, r);
                    }
                    finally
                    {
                        //Libération mémoire
                        if (r != null) r.Dispose();
                        r = null;
                    }
                }
            }
            catch { }
            finally
            {
                if (brush1 != null) brush1.Dispose();
                brush1 = null;
                if (brush2 != null) brush2.Dispose();
                brush2 = null;
            }
        }

Retour à La Une de Logo Paperblog

A propos de l’auteur


Jeremy.jeanson 1573 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Dossiers Paperblog