oui, pour le moment, je travaille sur la fermeture de la fenêtre, je verrai après pour l'ouverture
Code : Tout sélectionner
Global AW_Taille_Ecran_X.l, AW_Taille_Ecran_Y.l, AW_Taille_Fen_X.l, AW_Taille_Fen_Y.l
Enumeration
#AnimateWindow_Image
#AnimateWindow_Image2
#AnimateWindow
EndEnumeration
Procedure Haut()
Y = WindowY()
For n = 1 To 25
MoveWindow(WindowX(), Y - Int((1.5 * Pow(n / 25, 2) - 0.02 * n) * AW_Taille_Ecran_Y))
UpdateWindow_(WindowID(#AnimateWindow))
Delay(1)
Next
EndProcedure
Procedure Droite()
X = WindowX()
For n = 1 To 25
MoveWindow(X + Int((1.5 * Pow(n / 25, 2) - 0.02 * n) * AW_Taille_Ecran_X), WindowY())
UpdateWindow_(WindowID(#AnimateWindow))
Delay(1)
Next
EndProcedure
Procedure Bas()
Y = WindowY()
For n = 1 To 25
MoveWindow(WindowX(), Y + Int((1.5 * Pow(n / 25, 2) - 0.02 * n) * AW_Taille_Ecran_Y))
UpdateWindow_(WindowID(#AnimateWindow))
Delay(1)
Next
EndProcedure
Procedure Gauche()
X = WindowX()
For n = 1 To 25
MoveWindow(X - Int((1.5 * Pow(n / 25, 2) - 0.02 * n) * AW_Taille_Ecran_X), WindowY())
UpdateWindow_(WindowID(#AnimateWindow))
Delay(1)
Next
EndProcedure
Procedure Fermeture_H()
X = WindowX()
Y = WindowY()
For n = 1 To 24
ResizeWindow(AW_Taille_Fen_X - AW_Taille_Fen_X * n / 24, AW_Taille_Fen_Y)
MoveWindow(X + AW_Taille_Fen_X * n / 48, Y)
UpdateWindow_(WindowID(#AnimateWindow))
Delay(1)
Next
EndProcedure
Procedure Fermeture_V()
X = WindowX()
Y = WindowY()
For n = 1 To 24
ResizeWindow(AW_Taille_Fen_X, AW_Taille_Fen_Y - AW_Taille_Fen_Y * n / 24)
MoveWindow(X, Y + AW_Taille_Fen_Y * n / 48)
UpdateWindow_(WindowID(#AnimateWindow))
Delay(1)
Next
EndProcedure
Procedure Fermeture_T()
X = WindowX()
Y = WindowY()
For n = 1 To 24
ResizeWindow(AW_Taille_Fen_X - AW_Taille_Fen_X * n / 24, AW_Taille_Fen_Y - AW_Taille_Fen_Y * n / 24)
MoveWindow(X + AW_Taille_Fen_X * n / 48, Y + AW_Taille_Fen_Y * n / 48)
UpdateWindow_(WindowID(#AnimateWindow))
Delay(1)
Next
EndProcedure
Procedure Interieur()
For n = 20 To 1 Step - 1
Region1 = CreateRectRgn_(0, 0, AW_Taille_Fen_X, AW_Taille_Fen_Y)
Region2 = CreateRectRgn_(AW_Taille_Fen_X * n / 40, AW_Taille_Fen_Y * n / 40, AW_Taille_Fen_X - AW_Taille_Fen_X * n / 40, AW_Taille_Fen_Y - AW_Taille_Fen_Y * n / 40)
CombineRgn_(Region1, Region1, Region2, #RGN_DIFF)
SetWindowRgn_(WindowID(), Region1, #True)
UpdateWindow_(WindowID(#AnimateWindow))
Delay(1)
DeleteObject_(Region1)
DeleteObject_(Region2)
Next
EndProcedure
Procedure Saut()
; taille de la zone de l'écran utilisable (sans la barre des taches)
SystemParametersInfo_(#SPI_GETWORKAREA, 0, @Taille_Ecran.RECT, 0)
; la fenêtre tombe
Y = WindowY()
Chute = Taille_Ecran\Bottom - Y - AW_Taille_Fen_Y
Pas = Pow(Chute * 600 / AW_Taille_Ecran_Y, 0.5)
For n = 1 To Pas
MoveWindow(WindowX(), Y + Chute * n / Pas)
UpdateWindow_(WindowID(#AnimateWindow))
Delay(1)
Next
; la fenêtre fait un premier bond
Pas = Pas * 1.5
Chute = Chute * 0.4
Y = WindowY()
X = WindowX()
For n = 1 To Pas * 2
MoveWindow(X + Chute * n / Pas, Y - Int((n / Pas - Pow(n / Pas, 2)) * Chute * 4))
UpdateWindow_(WindowID(#AnimateWindow))
Delay(1)
Next
EndProcedure
Procedure Explose()
; taille et position de la fenêtre
GetWindowRect_(WindowID(#AnimateWindow), Fen.rect)
For n = 1 To 3
OpenWindow(#AnimateWindow + n, Fen\Left, Fen\Top, AW_Taille_Fen_X, AW_Taille_Fen_Y, #PB_Window_BorderLess | #PB_Window_Invisible, "")
SetWindowLong_(WindowID(#AnimateWindow + n), #GWL_EXSTYLE, GetWindowLong_(WindowID(#AnimateWindow + n), #GWL_EXSTYLE) | #WS_EX_TOOLWINDOW) ; choix de la barre d'outil réduite
If CreateGadgetList(WindowID(#AnimateWindow + n))
ImageGadget(n, 0, 0, AW_Taille_Fen_X, AW_Taille_Fen_Y, UseImage(#AnimateWindow_Image))
EndIf
ShowWindow_(WindowID(#AnimateWindow + n), #SW_SHOW)
Next
; on applique les masques au fenêtre
Region0 = CreateRectRgn_(0, 0, AW_Taille_Fen_X / 2, AW_Taille_Fen_Y / 2)
SetWindowRgn_(WindowID(#AnimateWindow), Region0, #True)
Region1 = CreateRectRgn_(AW_Taille_Fen_X, 0, AW_Taille_Fen_X / 2, AW_Taille_Fen_Y / 2)
SetWindowRgn_(WindowID(#AnimateWindow + 1), Region1, #True)
Region2 = CreateRectRgn_(AW_Taille_Fen_X, AW_Taille_Fen_Y, AW_Taille_Fen_X / 2, AW_Taille_Fen_Y / 2)
SetWindowRgn_(WindowID(#AnimateWindow + 2), Region2, #True)
Region3 = CreateRectRgn_(0, AW_Taille_Fen_Y, AW_Taille_Fen_X / 2, AW_Taille_Fen_Y / 2)
SetWindowRgn_(WindowID(#AnimateWindow + 3), Region3, #True)
DeleteObject_(Region0)
DeleteObject_(Region1)
DeleteObject_(Region2)
DeleteObject_(Region3)
; on écarte les morceaux
X = WindowX()
Y = WindowY()
For n = 1 To 30
Coef.f = Pow(n, 2) / 900
UseWindow(#AnimateWindow)
MoveWindow(X - AW_Taille_Ecran_X * Coef, Y - AW_Taille_Ecran_Y * Coef)
UpdateWindow_(WindowID(#AnimateWindow))
UseWindow(#AnimateWindow + 1)
MoveWindow(X + AW_Taille_Ecran_X * Coef, Y - AW_Taille_Ecran_Y * Coef)
UpdateWindow_(WindowID(#AnimateWindow + 1))
UseWindow(#AnimateWindow + 2)
MoveWindow(X + AW_Taille_Ecran_X * Coef, Y + AW_Taille_Ecran_Y * Coef)
UpdateWindow_(WindowID(#AnimateWindow + 2))
UseWindow(#AnimateWindow + 3)
MoveWindow(X - AW_Taille_Ecran_X * Coef, Y + AW_Taille_Ecran_Y * Coef)
UpdateWindow_(WindowID(#AnimateWindow + 3))
Delay(1)
Next
EndProcedure
Procedure.l Capture(WindowID.l)
; Cette procedure permet de créer une nouvelle fenêtre représentant la fenêtre à animée
; taille et position de la fenêtre
GetWindowRect_(WindowID, Fen.rect)
AW_Taille_Fen_X = Fen\Right - Fen\Left
AW_Taille_Fen_Y = Fen\Bottom - Fen\Top
; on fait une impression d'acran
DC = GetDC_(0)
CreateImage(#AnimateWindow_Image, AW_Taille_Fen_X, AW_Taille_Fen_Y)
Dessin = StartDrawing(ImageOutput())
bitblt_(Dessin, 0, 0, AW_Taille_Fen_X, AW_Taille_Fen_Y, DC, Fen\Left, Fen\Top, #SRCCOPY)
StopDrawing()
ReleaseDC_(0, DC)
; on créé la nouvelle fenêtre
OpenWindow(#AnimateWindow, Fen\Left, Fen\Top, AW_Taille_Fen_X, AW_Taille_Fen_Y, #PB_Window_BorderLess | #PB_Window_Invisible, "")
SetWindowLong_(WindowID(), #GWL_EXSTYLE, GetWindowLong_(WindowID(), #GWL_EXSTYLE) | #WS_EX_TOOLWINDOW) ; choix de la barre d'outil réduite
If CreateGadgetList(WindowID(#AnimateWindow + num))
ImageGadget(0, 0, 0, AW_Taille_Fen_X, AW_Taille_Fen_Y, UseImage(#AnimateWindow_Image))
EndIf
ShowWindow_(WindowID(), #SW_SHOW) ; montre la fenêtre
ProcedureReturn WindowID(#AnimateWindow)
EndProcedure
ProcedureDLL AnimateWindow(Window.l, Type.l) ; Animer la fermeture de la fenêtre
; Cette fonction permet d'animer la fermeture de la fenêtre
; Window : numéro de la fenêtre
; Type : numéro de l'animation, Type peut prendre les valeur suivante
; 0 = la fenêtre se sauve par le haut de l'écran
; 1 = la fenêtre se sauve par la droite de l'écran
; 2 = la fenêtre se sauve par le bas de l'écran
; 3 = la fenêtre se sauve par la gauche de l'écran
; 4 = fermeture de la fenêtre horizontalement
; 5 = fermeture de la fenêtre verticalement
; 6 = fermeture de la fenêtre horizonatlement et verticalement
; 7 = la fenêtre disparait de l'intérieur
; 8 = la fenêtre quitte l'écran en faisant des bonds sur le bas de l'écran
; 9 = on explose la fenêtre en 4 partie
Capture(WindowID(Window))
; on ferme l'ancienne fenêtre
CloseWindow(Window)
; on récupère la taille de l'écran
AW_Taille_Ecran_X = GetSystemMetrics_(#SM_CXSCREEN)
AW_Taille_Ecran_Y = GetSystemMetrics_(#SM_CYSCREEN)
UseWindow(#AnimateWindow)
; on anime la nouvelle fenêtre
Select Type
Case 0
Haut()
Case 1
Droite()
Case 2
Bas()
Case 3
Gauche()
Case 4
Fermeture_H()
Case 5
Fermeture_V()
Case 6
Fermeture_T()
Case 7
Interieur()
Case 8
Saut()
Case 9
Explose()
EndSelect
EndProcedure
;- Test
OpenWindow(0, 200, 100, 300, 200, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget, "Test")
Repeat
Event = WaitWindowEvent()
Until Event = #WM_Close
AnimateWindow(0, 9)
End