Effets de fondu animés (transparence/opacité) sur les fenêtres

Soyez le premier à donner votre avis sur cette source.

Vue 19 467 fois - Téléchargée 1 868 fois

Description

Le titre n'est pas très clair, alors voici ce qu'il y'a dans ce code :
3 fonctions qui font des fondus animés de votre fenêtre : elle apparait progressivement, de plus en plus transparent (ou l'inverse), si vous me comprenez.
Il y'a 3 fonctions :
FonduShow pour faire apparaitre une fenêtre en faisant un fondu
FonduHide pour faire disparaitre la fenetre
FonduChange pour changer la transparence mais en faisant un effet de fondu, c'est a dire progressif.

J'avais fais ça dans un gros programme mais autant vous en faire profiter.
Ne fonctionne que sous win2000, XP ou Server 2003 (logique à cause de la transparence) donc ne ralez pas les autres ;)

c'est très simple à utiliser et j'ai très (mais très) rarement eu des bugs, alors que j'y utilise tous les jours, je vous met le code du module ici, c'est très simple à appeler

Source / Exemple :


' MODULE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Option Explicit

' L'instruction Sleep pour faire une pause dans le prog
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

' Pour la transparence de la fenêtre
Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Boolean
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Const WS_EX_LAYERED = &H80000
Public Const LWA_COLORKEY = &H1
Public Const LWA_ALPHA = &H2
'renvoie les styles de la fenêtre
Public Const GWL_STYLE As Long = -16
'renvoie les styles étendus de la fenêtre
Public Const GWL_EXSTYLE As Long = -20
'renvoie la fenêtre propriétaire de la fenêtre
Public Const GWL_HWNDPARENT As Long = -8

' Active la transparence
Public Function ActiveTransparence(Fenêtre As Form, ByVal AlphaInit As Byte)
    On Error GoTo Err
    SetWindowLong Fenêtre.hWnd, GWL_EXSTYLE, GetWindowLong(Fenêtre.hWnd, GWL_EXSTYLE) Or WS_EX_LAYERED
    ChangeTransparence Fenêtre, AlphaInit
    Exit Function
Err:
End Function

' Change la transparence
Public Function ChangeTransparence(Fenêtre As Form, ByVal Alpha As Byte)
    On Error GoTo Err
    If Alpha = 0 Then DesactiveTransparence (Fenêtre): Exit Function
    SetLayeredWindowAttributes Fenêtre.hWnd, 0, Alpha, LWA_ALPHA
    Exit Function
Err:
End Function

' Supprime la transparence
Public Function DesactiveTransparence(Fenêtre As Form)
    On Error Resume Next
    SetWindowLong Fenêtre.hWnd, GWL_EXSTYLE, GetWindowLong(Fenêtre.hWnd, GWL_EXSTYLE) - WS_EX_LAYERED
End Function

' Fait un fondu de la fenêtre pour la faire disparaître
' Unload détermine si on décharge la fenêtre ou si on la cache juste
Public Function FonduHide(Fen As Form, ByVal UnloadInEnd As Boolean, ByVal AlphaInit As Integer)
    On Error GoTo PasXP
    Dim T As Integer
    ' Sinon on active la transparence
    ActiveTransparence Fen, AlphaInit
    ' Puis on augmente a chaque fois sa transparence
    For T = AlphaInit To 1 Step -5
        ChangeTransparence Fen, T
        Sleep 1
        DoEvents
    Next T
    If UnloadInEnd = True Then Unload Fen
    Exit Function
    ' Si on a pas XP
PasXP:
    If UnloadInEnd = True Then
        Unload Fen
    Else
        Fen.Visible = False
    End If
End Function

' Fait un fondu de la fenêtre pour la faire montrer
Public Function FonduShow(Fen As Form, ByVal AlphaFin As Integer)
    On Error GoTo PasXP
    Dim T As Integer
    ' Sinon on active la transparence mais la fenêtre est transparente a fond (donc invisible)
    ActiveTransparence Fen, 1
    Fen.Visible = True
    ' Puis on réduit a chaque fois sa transparence
    For T = 1 To AlphaFin Step 5
        ChangeTransparence Fen, T
        Sleep 1
        DoEvents
    Next T
    ' Puis si en final la fenêtre n'est plus transparente du tout (transparence à 255/255)
    ' alors on désactive la transparence
    If AlphaFin = 255 Then DesactiveTransparence Fen
    Exit Function
    ' Si on a pas XP
PasXP:
    Fen.Visible = True
End Function

' Change la transparence de la fenetre en faisant un fondu
Public Function FonduChange(Fen As Form, ByVal AlphaInit As Byte, ByVal AlphaFin As Byte)
    On Error GoTo PasXP
    Dim T As Long
    Dim Delta As Long
    Delta = IIf(AlphaInit - AlphaFin < 0, 5, -5)
    ' On active la transparence
    Fen.Visible = True
    ActiveTransparence Fen, AlphaInit
    ' Puis on réduit ou augmente a chaque fois sa transparence
    For T = AlphaInit To AlphaFin Step Delta
        ChangeTransparence Fen, T
        Sleep 1
        DoEvents
    Next T
    ' Si la fenêtre n'est plus transparente, on la désactive
    If AlphaFin = 255 Then DesactiveTransparence Fen
    ' Si on a pas XP
PasXP:
End Function

Conclusion :


On y appelle comme ça :

Private Sub Form_Load()
' Fait apparaitre la form
FonduShow Me, 255
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
' Fait disparaitre la form
FonduHide Me, True, 0
End Sub

et quand vous voulez vous pouvez utiliser :
FonduChange Me, AlphaInitial, AlphaFinal

Tout ceci est bien sur compatible avec les Unload Me, fermeture de la fenetre dans tout les sens, pas besoin de s'en soucier, tout est géré dans Form_Load et Form_Unload

Pour vous aider à vous repérer :
Transparent : 255
Opaque : 0

@ +
MadMatt

PS : des fois quand je fait disparaitre la form, j'ai un flash noir avant le fondu, dites moi si vous l'avez aussi et si vous avez une idée pour le faire disparaitre

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
336
Date d'inscription
jeudi 21 août 2008
Statut
Membre
Dernière intervention
19 juillet 2015

merci beaucoup pour ce code je vais le tester maintenant ;)
Messages postés
2167
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009
1
Tiens j'avais oublié d'ajouter ce que tu avais proposé Mortalino, c'est fait maintenant.
J'avais jamais fait gaffe que AnimateWindow gérait le fondu... Enfin cette fonction rend la fenetre toute noir et laisse une bande noire au dessus de la barre de titre de la fenetre, donc ma méthode a encore de l'intérêt (ouf ^^)
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut PCPT ;)

Et oui, c'est vrai, j'ai oublié de le modifier. Vu que je l'ai testé pour voir ce que ça faisait...

Merci de ton attention !
(je testerai pour l'API des touches...)

++
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
salut,
"Debug.Print" à remplacer par "Call" (sinon çà ne fonctionnera qu'en IDE ;) )
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
salut madm@tt,

sympa ta source. je m'en servirai certainement comme base pour mieux exploiter les APIs.

Essaie aussi de rajouter cette API :

Private Declare Function AnimateWindow Lib "user32" ( _
ByVal hWnd As Long, _
ByVal dwTime As Long, _
ByVal dwFlags As Long) As Long

Cet appel de fonction fera s'afficher progressivement la
fenêtre de son centre vers ses bords :
Debug.Print AnimateWindow(Me.hWnd, 10000, &H10 Or &H20000)

Constantes pour dwFlags :
AW_HOR_POSITIVE = &H1 Anime la fenêtre de gauche à droite.
AW_HOR_NEGATIVE = &H2 Anime la fenêtre de droite à gauche.
AW_VER_POSITIVE = &H4 Anime la fenêtre du haut vers le bas.
AW_VER_NEGATIVE = &H8 Anime la fenêtre du bas vers le haut.
AW_CENTER = &H10 Réduction de la fenêtre vers son centre (avec AW_HIDE), et inversement (avec AW_ACTIVATE).
AW_HIDE = &H10000 Cache la fenêtre.
AW_ACTIVATE = &H20000 Active la fenêtre.
AW_BLEND = &H80000 Effet de "fondu" sur la fenêtre (si elle est au premier niveau).
AW_SLIDE = &H40000 Fait "rouler" la fenêtre.

Si tu peux le faire, ce sera tjs un 'bonus' de plus dans ta source ;)

++
Afficher les 14 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.