.: dégradés dans polygones - très rapides (instantanés) :: gradientfill :.

Soyez le premier à donner votre avis sur cette source.

Vue 10 070 fois - Téléchargée 531 fois

Description

Voici en excluvité pour vous un prog qui vous montre comment utiliser l'api gradientfill pour dessiner des dégradés dans des triangles avec en prime la possibiité de tracés plusieurs dégradés avec un seul appel d'api.

Le module pour utiliser l'api est la-dessous, et un exemple d'utilisation du module est dans le pinguoin ( ziiiiiip le lynux )

Source / Exemple :


'Module :: Gradient
'Dégradés de couleurs entre trois points
'API Windows GradientFill
'Auteur : Alain Proviste - guesavo@hotmail.com

'Ce qu'il faut savoir pour que vous puissiez comprendre,
'et aussi pour m'éviter de commenter chaque action :

'Un Vertex est un point (x,y) + une couleur (R,G,B)
'Un triangle est un ensemble de trois vertex :
'    .Vertex1 = index du premier vertex
'    .vertex2 = index du second vertex
'    .vertex3 = index du troisième vertex
'
'L'api GradientFill rempli triangle avec un dégradés des couleurs des vertex
'--> Function GradientTriangle

'Il faut aussi savoir qu'un seul appel à l'api GradientFill peut
'remplir plusieurs triangle,
'par exemple pour faire un quadrilatère ( deux triangles avec un côté commun )
'--> Function GradientQuadri

'La Function GradientPoly est une généralisation pour un nombre illimité de points

Option Explicit

Private Type GRADIENT_TRIANGLE
    Vertex1 As Long
    Vertex2 As Long
    Vertex3 As Long
End Type

Private Type TRIVERTEX
    x As Long
    y As Long
    Rouge As Integer
    Vert As Integer
    Bleu As Integer
    Alpha As Integer
End Type

Public Type Point
    x As Long
    y As Long
    Rouge As Byte
    Vert As Byte
    Bleu As Byte
End Type

Private Declare Function GradientFill Lib "msimg32" _
   (ByVal hdc As Long, _
   pVertex As TRIVERTEX, _
   ByVal dwNumVertex As Long, _
   pMesh As GRADIENT_TRIANGLE, _
   ByVal dwNumMesh As Long, _
   ByVal dwMode As Long) _
As Long

Private Function Byte2Hex(Number As Byte) As Integer
   Byte2Hex = Val("&H" & Hex(Number / 16 * 256 * 16))
End Function

Public Function GradientTriangle(point1 As Point, point2 As Point, point3 As Point, targetHdc As Long) As Boolean

    Dim VERTEX(2) As TRIVERTEX
    Dim TRIANGLE  As GRADIENT_TRIANGLE
    
    With TRIANGLE
        .Vertex1 = 0
        .Vertex2 = 1
        .Vertex3 = 2
    End With

    With VERTEX(0)
        .x = point1.x
        .y = point1.y
        .Rouge = Byte2Hex(point1.Rouge)
        .Vert = Byte2Hex(point1.Vert)
        .Bleu = Byte2Hex(point1.Bleu)
    End With
    
    With VERTEX(1)
        .x = point2.x
        .y = point2.y
        .Rouge = Byte2Hex(point2.Rouge)
        .Vert = Byte2Hex(point2.Vert)
        .Bleu = Byte2Hex(point2.Bleu)
    End With
    
    With VERTEX(2)
        .x = point3.x
        .y = point3.y
        .Rouge = Byte2Hex(point3.Rouge)
        .Vert = Byte2Hex(point3.Vert)
        .Bleu = Byte2Hex(point3.Bleu)
    End With
    
    GradientTriangle = GradientFill(targetHdc, VERTEX(0), 3, TRIANGLE, 1, 2)

End Function

Public Function GradientQuadri(HG As Point, HD As Point, BG As Point, BD As Point, targetHdc As Long) As Boolean

    Dim VERTEX(3)   As TRIVERTEX
    Dim TRIANGLE(1) As GRADIENT_TRIANGLE
    
    With TRIANGLE(0)
        .Vertex1 = 0
        .Vertex2 = 1
        .Vertex3 = 2
    End With
    
    With TRIANGLE(1)
        .Vertex1 = 1
        .Vertex2 = 2
        .Vertex3 = 3
    End With

    With VERTEX(0)
        .x = HG.x
        .y = HG.y
        .Rouge = Byte2Hex(HG.Rouge)
        .Vert = Byte2Hex(HG.Vert)
        .Bleu = Byte2Hex(HG.Bleu)
    End With
    
    With VERTEX(1)
        .x = HD.x
        .y = HD.y
        .Rouge = Byte2Hex(HD.Rouge)
        .Vert = Byte2Hex(HD.Vert)
        .Bleu = Byte2Hex(HD.Bleu)
    End With
    
    With VERTEX(2)
        .x = BG.x
        .y = BG.y
        .Rouge = Byte2Hex(BG.Rouge)
        .Vert = Byte2Hex(BG.Vert)
        .Bleu = Byte2Hex(BG.Bleu)
    End With
    
    With VERTEX(3)
        .x = BD.x
        .y = BD.y
        .Rouge = Byte2Hex(BD.Rouge)
        .Vert = Byte2Hex(BD.Vert)
        .Bleu = Byte2Hex(BD.Bleu)
    End With
    
    GradientQuadri = GradientFill(targetHdc, VERTEX(0), 4, TRIANGLE(0), 2, 2)

End Function

Public Function GradientPoly(Points() As Point, targetHdc As Long)
    
    Dim NPoints     As Byte
    Dim i           As Byte
    Dim VERTEX()    As TRIVERTEX
    Dim TRIANGLE()  As GRADIENT_TRIANGLE
    
    NPoints = UBound(Points)
    
    ReDim VERTEX(NPoints)
    ReDim TRIANGLE(NPoints - 2)
    
    For i = 0 To NPoints - 2
    
        With TRIANGLE(i)
            .Vertex1 = 0
            .Vertex2 = i + 1
            .Vertex3 = i + 2
        End With
    
        DoEvents
    
    Next i
    
    For i = 0 To NPoints
        
        With VERTEX(i)
            .x = Points(i).x
            .y = Points(i).y
            .Rouge = Byte2Hex(Points(i).Rouge)
            .Vert = Byte2Hex(Points(i).Vert)
            .Bleu = Byte2Hex(Points(i).Bleu)
        End With
        
        DoEvents
        
    Next i
    
    GradientPoly = GradientFill(targetHdc, VERTEX(0), NPoints + 1, TRIANGLE(0), NPoints - 1, 2)
    
End Function

Conclusion :


Voilà voilà ça n'est pas très commenté, le commentaire de sources c'est pas mon fort ( alamo ? ) mais la pseudo-explication du module devrait suffire d'autant plus que j'ai laissé deux procédures ( gradienttriangle et gradientquadri ) qui devrait clarifier les choses et s'il faut je répondrais à toutes les questions ( en tout cas je répondrais aux questions qui concernent ce prog. )
Enfin vu que jamais personne ne regarde les sources sur les dégradés je crois que j'aurais pas trop de questions.
Au fait si vous vous servez du module, veuillez avoir l'extrème amabilité de laissez les lignes commentés du début.

Bonne prog. Et surtout ne pensez pas aux résultats du bac demain on s'en fout.

Codes Sources

Ajouter un commentaire Commentaires
Messages postés
908
Date d'inscription
jeudi 26 juillet 2001
Statut
Modérateur
Dernière intervention
1 février 2015
2
moi foi j'ai publié d'autres sources pour utiliser la même api pour des dégradés linéaires...
Messages postés
26
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
30 décembre 2003

pas keuwl c que pour les triangles!
Messages postés
192
Date d'inscription
vendredi 2 mars 2001
Statut
Membre
Dernière intervention
10 janvier 2006

Au fait pour le bac, t'as raison on s'en fout ;)
Messages postés
192
Date d'inscription
vendredi 2 mars 2001
Statut
Membre
Dernière intervention
10 janvier 2006

Tres sympa et tres util ton code, il peut etre utilisé pour la 3d par exemple si kekun veut s'amuser a faire un moteur d'affichage en pseudo-natif et en vb :p (OpenGL powa' :))! Pour le manque de commentaire, je pense que le code est assez simple pour qu'il soit compris rapidement! En parlant de rapidité, il serait sympa de faire des tests sur le FPS (Frame Per Second), en comprarant la vitesse d'affichage de ta fontcion GradientTriangle par rapport à GradientPoly pour un poly à 3 vertex (triangle), wala :)
Bon coding ++
GEFF

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.