Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

EFFETS DE FONDU ANIMÉS (TRANSPARENCE/OPACITÉ) SUR LES FENÊTRES


Information sur la source

Catégorie :Graphique Classé sous : fenetres, transparence, fondu, opacité, effet Niveau : Initié Date de création : 03/11/2004 Date de mise à jour : 09/08/2006 15:30:52 Vu / téléchargé: 13 336 / 1 506

Note :
9,43 / 10 - par 7 personnes
9,43 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
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

  • ' 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
' 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
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

22 novembre 2005 18:29:28 :
Ajout des mots clés
09 août 2006 15:30:52 :
ajout de l'api "AnimateWindow"

Commentaires et avis

signaler à un administrateur
Commentaire de Dragonmaster le 03/11/2004 15:13:06

Ok, j'ai testé. La fenêtre clignote avant le la fermer en fondu. est ce normal ?

signaler à un administrateur
Commentaire de MadM@tt le 03/11/2004 15:53:23

Bah c'est ce que j'ai dit, quand on fait FonduHide ça fait un petit flash, a mon avis c'est parce qu'on active la transparence. Parce que si la fenetre est déjà transparente avant ça ne le fait pas, ce qu'il faudrait c'est que la fenêtre soit tout le temps transparente mais le + opaque possible pendant l'utilisation, comme ça après on a pas à réactiver la transparence quand on ferme la fenetre,et donc pas de flash... (tu me comprend lol ?)

signaler à un administrateur
Commentaire de Dragonmaster le 03/11/2004 19:10:23

Euhhhh... je ne suis pas sûr...
L'effet est "plus visible" quand la fenêtre est maximisé.

Chapô pour l'effet de fondu !

signaler à un administrateur
Commentaire de MadM@tt le 03/11/2004 19:29:30

merci ;)

signaler à un administrateur
Commentaire de PCPT le 04/03/2005 22:18:51 administrateur CS

Salut,
bon, j'ai un problème avec ce genre de sources, il y en a plein, à peu près toutes les mêmes. si j'ai bien compris le principe, on peut soit rendre la fenêtre transparente à un certain degré (0 à 255), soir une couleur spécifique à 100%.

y'a t'il une manière de cumuler les 2?
merci..

PCPT

signaler à un administrateur
Commentaire de MadM@tt le 06/03/2005 11:19:59

Euh à propos de la couleur spécifique à 100% je ne voit pas trop ce que tu veux dire...

signaler à un administrateur
Commentaire de PCPT le 06/03/2005 14:12:09 administrateur CS

Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Boolean
hWnd pour la form
crKey pour la couleur à rendre invisible
bAplha pour le degré de transparence
dwFlags pour le choix entre invisible et transparent

donc pour rendre une forme transparente (170/255)
et lui rendre totalement ses coins roses (&HFF00FF), je fais

Call SetWindowLong(Me.hwnd, GWL_EXSTYLE, WS_EX_LAYERED)
If Transparence = True Then
Call SetLayeredWindowAttributes(Me.hwnd, &HFF00FF, Alpha, &H3)
Else
Call SetLayeredWindowAttributes(Me.hwnd, &HFF00FF, 255, &H3)
End If

ça fonctionne, mais la fom n'est plus dans la barre des tâches, donc tout ce qui y est lié, ensuite,
bah ah marche pu !!!

si t'en as le temps et l'envie, j'ai mis la source ici
http://www.vbfrance.com/code.aspx?ID=29918

merci
PCPT

signaler à un administrateur
Commentaire de MadM@tt le 06/03/2005 21:28:34

Ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
d'accord je vois ce que tu veux dire et quelle est ta question. Tout d'abord je n'ai jamais entendu parler d'une telle source, mais je ne les connais pas toutes lol.
Par contre quand tu dis combiner les 2, tu veux dire "découper" la form avec une couleur PUIS rendre la form découpée transparente ? La c'est possible il suffit d'appliquer les api les une à la suite des autres.
Par contre si tu voulait dire rendre transparent la form mais pas au meme niveau sur toute sa surface, c'est transparent en fonction de la couleur.... et dans ce cas je n'ai jamais entendu parler d'une telle source mais je ne les connais pas toutes lol

signaler à un administrateur
Commentaire de PCPT le 06/03/2005 21:52:21 administrateur CS

pour la source en question, c'est la mienne, publiée hier, donc logique qu'elle te soit inconnue ;)

en effet, je parle bien de découper une forme (en lui otant une couleur.... la rendre invisible), puis de rendre transparente (0 à 255) la forme "découpée"

mais la simple utilisation successive de  "SetLayeredWindowAttribute" pour invisible, puis transparent (ou l'inverse), ne fonctionne pas.
(seul le dernier appel est pris en compte)

par contre, en utilisant "SetWindowLong" (comme détaillé au dernier post), çà fonctionne bien, mais la feuille n'apparaît plus dans la barre des tâches, ce qui est génant pour mon usage... :-\

une idée?
PCPT

signaler à un administrateur
Commentaire de mortalino le 07/08/2006 01:09:08

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  ;)

++

signaler à un administrateur
Commentaire de PCPT le 09/08/2006 15:16:07 administrateur CS

salut,
"Debug.Print" à remplacer par "Call" (sinon çà ne fonctionnera qu'en IDE ;) )

signaler à un administrateur
Commentaire de mortalino le 09/08/2006 15:20:46

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...)

++

signaler à un administrateur
Commentaire de MadM@tt le 09/08/2006 15:31:11

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 ^^)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Effet de fondu a l ouverture/fermeture d une form [ par kaiserzeus ] Salut,je cherche a pouvoir faire un fondu sur une form pour un spplash screen.Ca fait un moment que je cherche et je ne trouve pas mon bonheur en VB.E Transparence & Opacité [ par kahlouni ] Comment faire pour une Transparence &amp; Opacit&#233; dans une image en utilisant un timer ?*un exemple si possible images .... [ par jerexgrz ] J'ai bien avancé mon jeu de strategie cependant, pour faire l'effet de transparence, j'hesite ! je pense convertir mes images pour les transformer en Effet fondu sur Picturebox [ par alihome ] Bonjour à tous,J'aimerais que quand je charge mon image à partir d'un fichier, elle apparraisse petit à petit, comme une fondu inverse.J'ai peut etre opacité d'une image [ par DIJONCTER ] bonjour à tous !Voila comment je fais pour modifier la transparence d'une picturebox (opaciter) dans vb 2005 avec des lignes de programme sans passer Style de fenetres comme visual studio [ par alligo ] Bonjour,Je crée une application qui doit gerer beaucoup de feuilles donc naturellement je me dit qua ca serait bien d'utiliser quelquechose comme le c [VB 5 ] Format d'image transparence [ par Stalko ] Bonjour,   sous Visual Basic 5, le contrôle Image admet un nombre relativement faible de format. À ma connaissance, seuls les format *.ico et *.GIF pe Besoin de lister les fenetres qui flash (blink) [ par werdDomain ] Bonjours, jaurais besoin de lister les fenetres, dans la TaskBar, seux qui sont Orange et/ou qui flash (sous windows xp)Svp aidez moiMerci [VB 2008] effet survol comme Vista [ par swan94 ] Salut à tous,je voudrais savoir s'il existait (ou le cas échéant, comment le faire), un control qui, comme sur le panneau de config Vista, lorsque l'o apparition picturebox en fondu [ par gsn ] BonjourComment faire apparaitre un picturebox en fondu ????? Merci


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.