Enumeration
#fenetre
#rond
#petitrond
#moyenrond
EndEnumeration
Declare.f RotationX(x, angle.f, dist)
Declare.f RotationY(Y, angle.f, dist)
Declare Forme(fenetre,forme)
Declare RemoveFromTaskbar(hwnd)
; *********** initialisation *********
Global rezX=320
Global rezy=240
Global xa=rezy/2
Global ya=rezy/2
Global distance=rezy/2-4
Global degress,degresm,degresh, tops, topm, toph
Structure sprite
x.l
Y.l
vitesse.l
EndStructure
Dim sprite.sprite(1000)
; ******************************
InitMouse ()
InitKeyboard ()
; ******** ** pour le sprite *****************
InitSprite ()
; ***************************************
OpenWindow ( #fenetre , 0,0, rezX, rezy, "Horloge" , #PB_Window_BorderLess ) ; on ouvre une fenetre
Handle= WindowID ( #fenetre )
; Style_etendu=GetWindowLong_(WindowID(#fenetre),#GWL_EXSTYLE)
; SetWindowLong_(WindowID(#fenetre),#GWL_EXSTYLE,Style_etendu|#WS_EX_TOOLWINDOW)
OpenWindowedScreen ( WindowID ( #fenetre ) , 0, 0, rezX, rezy, 0, 0, 0) ; on met un ecran dedans !!
; AddSysTrayIcon(1, WindowID(0), LoadImage(0, "D:\PureBasic\dobro\logo\icone.ico"))
; SysTrayIconToolTip(1, "horloge")
; StickyWindow(#fenetre,1)
RemoveFromTaskbar( FindWindow_ ( #fenetre , "Horloge" )) ; fait disparaitre la fenetre de la barre des taches
For spr=100 To 1000
CreateSprite (spr,2,2)
StartDrawing ( SpriteOutput (spr)) ;
sprite(spr)\x= Random (rezX)
sprite(spr)\Y= Random (rezy)
sprite(spr)\vitesse= Random (3)+1
Circle (1,1,1, RGB ( Random (255), Random (255), Random (255)))
StopDrawing ()
Next spr
Forme ( #fenetre ,2) ; ronde
Repeat ; boucle principale
Event= WindowEvent () ; on regarde si quelqu'un a cliqué sur la croix pour quitter
ExamineMouse () ; on demande a purebasic de surveiller les event de souris !
ExamineKeyboard () ; on demande a purebasic de surveiller les event de clavier!
; *************************
date = Date ()
Heure= Hour (date)
Minute = Minute (date)
Seconde= Second (date)
For spr=100 To 1000
DisplaySprite (spr, sprite(spr)\x, sprite(spr)\Y)
sprite(spr)\Y= sprite(spr)\Y+sprite(spr)\vitesse
If sprite(spr)\Y>rezy: sprite(spr)\Y=1: EndIf
Next spr
If MouseButton (2) Or KeyboardPushed ( #PB_Key_All ) ; le bouton de souris droit fait quitter ! ou bien n'importe quel touche
End
EndIf
If MouseButton (1)
SendMessage_ ( WindowID ( #fenetre ), #WM_NCLBUTTONDOWN , #HTCAPTION , 0)
EndIf
degress=Seconde*6
; Ici, le code à executer toutes les secondes
xs= RotationX(xa, degress-90, distance)
Ys= RotationY(ya, degress-90, distance)
; aiguille des secondes
StartDrawing ( ScreenOutput ())
LineXY (xa, ya, xs, Ys , RGB ($E9,$32,$92)) ; les secondes rouge
StopDrawing ()
; Ici, le code à executer toutes les minutes
degresm = Minute *6
xm= RotationX(xa, degresm-90, distance-25)
Ym= RotationY(ya, degresm-90, distance-25)
; aiguille des minute
StartDrawing ( ScreenOutput ())
LineXY (xa, ya, xm, Ym , RGB ($5,$E2,$B6)) ; les minutes verte
StopDrawing ()
; Ici, le code à executer toutes les heures
degresh =Heure*6*5
xh= RotationX(xa, degresh-90, distance-50)
Yh= RotationY(ya, degresh-90, distance-50)
; aiguille des heures
StartDrawing ( ScreenOutput ())
LineXY (xa, ya, xh, Yh , RGB ($F5,$F9,$6A)) ; les heures jaune
StopDrawing ()
StartDrawing ( ScreenOutput ())
DrawingMode ( #PB_2DDrawing_Transparent )
DrawText (xa- TextWidth ( "By Dobro" )/2, rezy/2-100, "By Dobro" , RGB ($7A,$97,$FC), RGB ($0,$0,$0))
DrawText (ya- TextWidth ( Str (Heure)+ ":" + Str ( Minute )+ ":" + Str (Seconde))/2, rezy/2, Str (Heure)+ ":" + Str ( Minute )+ ":" + Str (Seconde) , RGB ($7A,$97,$FC), RGB ($0,$0,$0))
StopDrawing ()
;{ ****************** dessin de l'horloge **********************
For a=1 To 60
degres =degres+6 : If degres=360:degres=0: EndIf : ; cela fait tourner
x= RotationX(xa, degres, distance)
Y= RotationY(ya, degres, distance)
quart=quart+1
If quart=15
quart=0
StartDrawing ( ScreenOutput ())
Circle (x,Y,8, RGB ($F9,$66,$FD))
StopDrawing ()
EndIf
min=min+1
If min<>15
StartDrawing ( ScreenOutput ())
Circle (x,Y,4, RGB ($75,$66,$FD))
StopDrawing ()
Else
min=0
EndIf
min2=min2+1
If min2=5
StartDrawing ( ScreenOutput ())
Circle (x,Y,4, RGB ($E7,$F0,$39))
StopDrawing ()
min2=0
EndIf
Next a
;} ****************************************************************************
; ***************************************************
FlipBuffers ()
ClearScreen ( RGB (0, 0, 0)) ; <--- c'est la place normale pour le clearscreen !!
Delay (5)
Until Event= #PB_Event_CloseWindow ; boucle temps que l'evenement de fenetre n'est pas #PB_Event_CloseWindow (un appuis sur la croix)
; chose qui ne peut pas arrivé sur ce programme !!
Return
Procedure.f RotationX(x, angle.f, dist)
ProcedureReturn x + Cos (angle.f* #PI /180)*dist
EndProcedure
Procedure.f RotationY(Y, angle.f, dist)
ProcedureReturn Y + Sin (angle.f* #PI /180)*dist
EndProcedure
Procedure Forme(fenetre,forme)
If forme=1 ; si on a choisi la forme 1 Angles arrondis
Region = CreateRoundRectRgn_ (0, 0, WindowWidth (fenetre), WindowHeight (fenetre), 40, 60) ; Création de la région pour faire une fenêtre avec les angles arrondis
; CreateRoundRectRgn_(X1, Y1, X2, Y2, R1, R2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
; R1, R2 : rayon de l'ellipse qui va servir à arrondir les angles de la region
SetWindowRgn_ ( WindowID (fenetre), Region, #True ) ; On applique la région
DeleteObject_ (Region) ; On supprime la région
ElseIf forme=2 ; si on a choisi la forme 2 Ronde
Region = CreateEllipticRgn_ (0, 0, WindowHeight (fenetre), WindowHeight (fenetre)) ; Création de la région pour faire une fenêtre elliptique
; CreateEllipticRgn_(X1, Y1, X2, Y2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
SetWindowRgn_ ( WindowID (fenetre), Region, #True ) ; On applique la région
DeleteObject_ (Region) ; On supprime la région
ElseIf forme=3 ; si on a choisi la forme 3 Triangle
Region = CreatePolygonRgn_ (?Triangle, 4, #ALTERNATE ) ; Création de la région pour faire une fenêtre elliptique
; CreateRoundRectRgn_(Array, NbPoints, Type)
; Array : Adresse de la liste ou de la Data
; NbPoints : Nombre de points du polygone + 1 (car on fait une boucle donc on a 2 fois le premier point)
; Type : Voir msdn
SetWindowRgn_ ( WindowID (fenetre), Region, #True ) ; On applique la région
DeleteObject_ (Region) ; On supprime la région
ElseIf forme=4 ; si on a choisi la forme 4 Trouée
Region1 = CreateRectRgn_ (0, 0, WindowWidth (fenetre), WindowHeight (fenetre)) ; Création d'une région en rectangle
Region2 = CreateRectRgn_ (10, 10, WindowWidth (fenetre) - 10, 50) ; Création d'une région en rectangle
; CreateRectRgn_(X1, Y1, X2, Y2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
CombineRgn_ (Region1, Region1, Region2, #RGN_DIFF ) ; On combine les 2 régions
; Les modes suivants sont disponibles :
; #RGN_AND : Intersection
; #RGN_OR : Union
; #RGN_DIFF : Différences
; #RGN_XOR : Union moins les intersections
SetWindowRgn_ ( WindowID (fenetre), Region1, #True ) ; On applique la région finale
DeleteObject_ (Region1) ; On supprime les régions
DeleteObject_ (Region2)
ElseIf forme=5 ; si on a choisi la forme 5 Triangle + Rond
Region1 = CreatePolygonRgn_ (?Triangle, 4, #ALTERNATE )
Region2 = CreateEllipticRgn_ (0, 0, WindowWidth (fenetre), WindowHeight (fenetre))
CombineRgn_ (Region1, Region1, Region2, #RGN_OR ) ; On combine les 2 régions
SetWindowRgn_ ( WindowID (fenetre), Region1, #True ) ; On applique la région finale
DeleteObject_ (Region1) ; On supprime les régions
DeleteObject_ (Region2)
ElseIf forme=6 ; si on a choisi la forme 2 Ronde troué
Region = CreateEllipticRgn_ (0, 0, WindowHeight (fenetre), WindowHeight (fenetre)) ; Création de la région pour faire une fenêtre elliptique
Region2 = CreateEllipticRgn_ (15, 15, WindowHeight (fenetre)-15, WindowHeight (fenetre)-15) ; Création de la région pour faire une fenêtre elliptique
CombineRgn_ (Region1, Region1, Region2, #RGN_DIFF ) ; On combine les 2 régions
; CreateEllipticRgn_(X1, Y1, X2, Y2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
SetWindowRgn_ ( WindowID (fenetre), Region, #True ) ; On applique la région
DeleteObject_ (Region) ; On supprime la région
DeleteObject_ (Region2)
EndIf
EndProcedure
Procedure RemoveFromTaskbar(hwnd)
If IsWindow_ (hwnd)
a=hwnd : b= GetWindowLong_ (a, #GWL_HWNDPARENT ) : If b<>0 : a=b : EndIf ; Needed for "TaskAssign.exe".
ShowWindow_ (a, #SW_HIDE ) : GetWindowRect_ (a,win.RECT) : w=win\right-win\left : h=win\bottom-win\top
SetWindowLong_ (a, #GWL_EXSTYLE , #WS_EX_TOOLWINDOW ) : SetWindowPos_ (a,0,0,0,w-1,h-1, #SWP_NOMOVE )
SetWindowPos_ (a,0,0,0,w,h, #SWP_NOMOVE|#SWP_SHOWWINDOW ) : ProcedureReturn 1
EndIf
EndProcedure
DataSection
Triangle :
Data.l 200, 400, 0, 0, 400, 0, 200, 400 ; Coordonnées des points du triangle en x, y (il faut faire une boucle donc on revient au premier point du triangle
EndDataSection