Horloge analogique paramètrable

Programmation d'applications complexes
Avatar de l’utilisateur
plabouro472
Messages : 40
Inscription : sam. 23/juil./2022 10:17

Horloge analogique paramètrable

Message par plabouro472 »

Forme des aiguilles personnalisables
Couleur des aiguilles personnalisables
aiguilles pleines ou creuses
Sens de rotation des aiguilles inversable
Ajout possible de textes sur l'horloge
Ajout possible de décalage horaire pour chacune des horloges
Adaptation automatique aux ImageGadget

ATTENTION ! :oops: Dans la version précédente, un plantage se produisait après quelques heure de fonctionnement.
En effet, Dans l'objet Horloge : "Obj Horloge.pb", la mémoire graphique du cadran de l'horloge n'est pas libéré et surchargeait la mémoire lors de la CopyImage provocant un plantage.
C'est ici qu'il manquait la ligne suivante : FreeImage( \CadranHorloge )
A saisir manuellement ou téléchargez le nouveau code complet

Code : Tout sélectionner

Procedure			Obj_Horloge_DessineAiguille			( *This.Obj_Horloge_Typ )
	Protected	.i	i
	With *This
		  FreeImage( \CadranHorloge	) ; Ligne ajoutee pour corriger le bug
		\CadranHorloge	= CopyImage		( \CadranFond	, #PB_Any	)
		StartDrawing	( ImageOutput( \CadranHorloge	)	)
		SetOrigin			( \DimX / 2	,	\DimY / 2 )							; Place l'origine du tracé
		DrawingMode( #PB_2DDrawing_Outlined	)
		

Voici maintenant le code corrigé
L'objet Horloge : "Obj Horloge.pb"
Pour toutes information concernant la POO
veuillez consulter le forum de PureBasic.

Code : Tout sélectionner


;
; Programmation POO avec PureBasic V6.12
; Pour toutes information concernant la POO
; veuillez consulter le forum PureBasic.
; Il sera facile pour les initiés
; d'apporter les modifications dont ils auront besoins
;

Interface NewObj_Horloge
 NewAiguille       ( Typ.s )
 AddPointAiguille  ( Typ.s , Dx.w , Dy.w )
 SetFill           ( Typ.s , Dx.w , Dy.w  )
 SetColor          ( Typ.s , Coul.i    )
 SetTime           ( Time.q        )
 SetTexte          ( Dx.w , Dy.w , Txt.s )
 Free              ( )
EndInterface

Structure Coordonnee
 x      .w
 y      .w
 Ray    .f
 Arg    .f
 CoulOn .a
EndStructure

Structure Obj_Horloge_Typ
 *DSVT
 
 Diametre         .f
 Rayon            .f
 RadParSeconde_H  .f
 RadParSeconde_M  .f
 RadParSeconde_S  .f
 Sens         .f
 
 Couleur_H            .l
 Couleur_M            .l
 Couleur_S            .l
 CouleurFond          .l
 CouleurRepereCadran  .l
 
 NbPointAigui      .a
 NbPointAigui_H    .b
 NbPointAigui_M    .b
 NbPointAigui_S    .b
 
 GadgetImage      .i
 CadranFond       .i
 CadranHorloge    .i
 
 DimX         .w
 DimY         .w
 RayonMini    .w
 RayonMaxi    .w
 RayonUnit    .w
 
 OldSec       .u
 
 FillHeure    .Coordonnee
 FillMinute   .Coordonnee
 FillSeconde  .Coordonnee
 
 Array AiguilleHeure   .Coordonnee ( 1 )
 Array AiguilleMinute  .Coordonnee ( 1 )
 Array AiguilleSeconde .Coordonnee ( 1 )
EndStructure

; Procedures Privees
Procedure .f GetAngleRad ( Dx.f  , Dy.f  )
 Protected .f ValTmp
 
 ValTmp = ATan2( Dx, Dy)
 If ValTmp < 0 : ValTmp + ( 2* #PI ) : EndIf
 ProcedureReturn ValTmp
EndProcedure
Procedure .f GetModule ( Dx.f  , Dy.f  )
 ProcedureReturn Sqr( Dx*Dx + Dy*Dy )
EndProcedure
Procedure .w GetCoordX ( Modul.f , Argum.f )
 ProcedureReturn Modul * Cos( Argum )
EndProcedure
Procedure .w GetCoordY ( Modul.f , Argum.f )
 ProcedureReturn Modul * Sin( Argum )
EndProcedure

Procedure   Obj_Horloge_CalcPtsAiguille ( *This.Obj_Horloge_Typ , Rad_H.f , Rad_M.f , Rad_S.f )
 Protected .i i
 With *This
  For i = 0 To \NbPointAigui_H
   \AiguilleHeure( i )\x   = GetCoordX( \AiguilleHeure( i )\Ray , \AiguilleHeure( i )\Arg + Rad_H  )
   \AiguilleHeure( i )\y   = GetCoordY( \AiguilleHeure( i )\Ray , \AiguilleHeure( i )\Arg + Rad_H  )
  Next
  \FillHeure\x        = GetCoordX( \FillHeure\Ray , \FillHeure\Arg + Rad_H  )
  \FillHeure\y        = GetCoordY( \FillHeure\Ray , \FillHeure\Arg + Rad_H  )
  
  For i = 0 To \NbPointAigui_M
   \AiguilleMinute( i )\x  = GetCoordX( \AiguilleMinute( i )\Ray , \AiguilleMinute( i )\Arg + Rad_M )
   \AiguilleMinute( i )\y  = GetCoordY( \AiguilleMinute( i )\Ray , \AiguilleMinute( i )\Arg + Rad_M )
  Next
  \FillMinute\x        = GetCoordX( \FillMinute\Ray , \FillMinute\Arg + Rad_M )
  \FillMinute\y        = GetCoordY( \FillMinute\Ray , \FillMinute\Arg + Rad_M )
  
  For i = 0 To \NbPointAigui_S
   \AiguilleSeconde( i )\x  = GetCoordX( \AiguilleSeconde( i )\Ray , \AiguilleSeconde( i )\Arg + Rad_S )
   \AiguilleSeconde( i )\y  = GetCoordY( \AiguilleSeconde( i )\Ray , \AiguilleSeconde( i )\Arg + Rad_S )
  Next
  \FillSeconde\X       = GetCoordX( \FillSeconde\Ray , \FillSeconde\Arg + Rad_S )
  \FillSeconde\Y       = GetCoordY( \FillSeconde\Ray , \FillSeconde\Arg + Rad_S )
  
 EndWith
 
EndProcedure
Procedure   Obj_Horloge_DessineAiguille ( *This.Obj_Horloge_Typ )
 Protected .i i
 
 With *This
  FreeImage( \CadranHorloge	) ; Ligne ajoutee pour corriger le bug
  \CadranHorloge = CopyImage  ( \CadranFond , #PB_Any )
  StartDrawing ( ImageOutput  ( \CadranHorloge ) )
  SetOrigin   ( \DimX / 2 , \DimY / 2 )       ; Place l'origine du tracé
  DrawingMode( #PB_2DDrawing_Outlined )
  
  FrontColor( \Couleur_S )
  If \NbPointAigui_S > 0
   For i = 0 To \NbPointAigui_S - 1
    LineXY( \AiguilleSeconde( i )\x , -\AiguilleSeconde( i )\y , \AiguilleSeconde( i + 1 )\x , -\AiguilleSeconde( i + 1 )\y )
   Next
  ElseIf \NbPointAigui_S = 0
   Circle ( \AiguilleSeconde( 0 )\x , -\AiguilleSeconde( i )\y , \RayonUnit )
  EndIf
  If \FillSeconde\CoulOn
   FillArea( \FillSeconde\x , -\FillSeconde\y , \Couleur_S )
  EndIf
  
  
  FrontColor( \Couleur_M )
  If \NbPointAigui_M > 0
   For i = 0 To \NbPointAigui_M - 1
    LineXY( \AiguilleMinute( i )\x , -\AiguilleMinute( i )\y , \AiguilleMinute( i + 1 )\x , -\AiguilleMinute( i + 1 )\y )
   Next
  ElseIf \NbPointAigui_M = 0
   Circle ( \AiguilleMinute( 0 )\x , -\AiguilleMinute( i )\y , \RayonUnit )
  EndIf
  If \FillMinute\CoulOn
   FillArea( \FillMinute\x , -\FillMinute\y , \Couleur_M )
  EndIf
  
  FrontColor( \Couleur_H )
  If \NbPointAigui_H > 0
   For i = 0 To \NbPointAigui_H - 1
    LineXY( \AiguilleHeure( i )\x , -\AiguilleHeure( i )\y , \AiguilleHeure( i + 1 )\x , -\AiguilleHeure( i + 1 )\y )
   Next
  ElseIf \NbPointAigui_H = 0
   Circle ( \AiguilleHeure( 0 )\x , -\AiguilleHeure( i )\y , \RayonUnit )
  EndIf
  If \FillHeure\CoulOn
   FillArea( \FillHeure\x , -\FillHeure\y , \Couleur_H )
  EndIf
  
  FrontColor( \CouleurRepereCadran )
  DrawingMode( #PB_2DDrawing_Default  )
  Circle ( 0, 0, 2 )            ; Trace L'axe des aiguilles sur le cadran
  
  StopDrawing()
 EndWith
EndProcedure

; Procedures Publiques
Procedure   Obj_Horloge_NewAiguille     ( *This.Obj_Horloge_Typ , Typ.s )
 With *This
  Select UCase( Typ ) 
   Case "H"
    \NbPointAigui_H    = -1
    \FillHeure\CoulOn   = #False
    ;CaseEnd			Utilisé uniquement pour le pliage du code
   Case "M"
    \NbPointAigui_M    = -1
    \FillMinute\CoulOn  = #False
    ;CaseEnd			Utilisé uniquement pour le pliage du code
   Case "S"
    \NbPointAigui_S    = -1
    \FillSeconde\CoulOn  = #False
    ;CaseEnd			Utilisé uniquement pour le pliage du code
   Default
    \NbPointAigui_H    = -1
    \NbPointAigui_M    = -1
    \NbPointAigui_S    = -1
    ;DefaultEnd			Utilisé uniquement pour le pliage du code
  EndSelect
 EndWith
EndProcedure
Procedure   Obj_Horloge_AddPointAiguille ( *This.Obj_Horloge_Typ , Typ.s , Dx.w , Dy.w  )
 Protected .w X  , Y
 Protected .w Dmin , Dmax , DifX , DifY
 With *This
  X  = \Rayon * Dx / 100
  Y  = \Rayon * Dy / 100
  Select UCase( Typ )
   Case "H"
    \NbPointAigui_H + 1
    If \NbPointAigui_H > \NbPointAigui
     \NbPointAigui_H - 1
     MessageRequester( "Limite atteinte" , Str( \NbPointAigui + 1 ) + " Points MAXI" , #PB_MessageRequester_Ok )
     ProcedureReturn -1
    Else
     \AiguilleHeure  ( \NbPointAigui_H )\X   = X
     \AiguilleHeure  ( \NbPointAigui_H )\Y   = Y
     \AiguilleHeure  ( \NbPointAigui_H )\Ray  = GetModule  ( X , Y )
     \AiguilleHeure  ( \NbPointAigui_H )\Arg  = GetAngleRad ( X , Y )
    EndIf
    ;CaseEnd			Utilisé uniquement pour le pliage du code
   Case "M"
    \NbPointAigui_M + 1
    If \NbPointAigui_M > \NbPointAigui
     \NbPointAigui_M - 1
     MessageRequester( "Limite atteinte" , Str( \NbPointAigui + 1 ) + " Points MAXI" , #PB_MessageRequester_Ok )
     ProcedureReturn -1
    Else
     \AiguilleMinute  ( \NbPointAigui_M )\X   = X
     \AiguilleMinute  ( \NbPointAigui_M )\Y   = Y
     \AiguilleMinute  ( \NbPointAigui_M )\Ray  = GetModule  ( X , Y )
     \AiguilleMinute  ( \NbPointAigui_M )\Arg  = GetAngleRad ( X , Y )
    EndIf
    ;CaseEnd			Utilisé uniquement pour le pliage du code
   Case "S"
    \NbPointAigui_S + 1
    If \NbPointAigui_S > \NbPointAigui
     \NbPointAigui_S - 1
     MessageRequester( "Limite atteinte" , Str( \NbPointAigui + 1 ) + " Points MAXI" , #PB_MessageRequester_Ok )
    Else
     \AiguilleSeconde ( \NbPointAigui_S )\X   = X
     \AiguilleSeconde ( \NbPointAigui_S )\Y   = Y
     \AiguilleSeconde ( \NbPointAigui_S )\Ray  = GetModule  ( X , Y )
     \AiguilleSeconde ( \NbPointAigui_S )\Arg  = GetAngleRad ( X , Y )
    EndIf
    ;CaseEnd			Utilisé uniquement pour le pliage du code
  EndSelect
  
  
  
  
 EndWith
EndProcedure
Procedure   Obj_Horloge_SetFill       ( *This.Obj_Horloge_Typ , Typ.s , Dx.w , Dy.w )
 Protected .w X  , Y
 With *This
  X  = \Rayon * Dx / 100
  Y  = \Rayon * Dy / 100
  Select UCase( Typ ) 
   Case "H"
    If \NbPointAigui_H    > -1
     \FillHeure\x         = X
     \FillHeure\y         = Y
     \FillHeure\Ray       = GetModule  ( X , Y )
     \FillHeure\Arg       = GetAngleRad ( X , Y )
     \FillHeure\CoulOn    = #True
    EndIf
    ;CaseEnd			Utilisé uniquement pour le pliage du code
   Case "M"
    If \NbPointAigui_M    > -1
     \FillMinute\x        = X
     \FillMinute\y        = Y
     \FillMinute\Ray      = GetModule  ( X , Y )
     \FillMinute\Arg      = GetAngleRad ( X , Y )
     \FillMinute\CoulOn   = #True
    EndIf
    ;CaseEnd			Utilisé uniquement pour le pliage du code
   Case "S"
    If \NbPointAigui_S    > -1
     \FillSeconde\x       = X
     \FillSeconde\y       = Y
     \FillSeconde\Ray     = GetModule  ( X , Y )
     \FillSeconde\Arg     = GetAngleRad ( X , Y )
     \FillSeconde\CoulOn  = #True
    EndIf
    ;CaseEnd			Utilisé uniquement pour le pliage du code
  EndSelect
 EndWith
EndProcedure
Procedure   Obj_Horloge_SetColor ( *This.Obj_Horloge_Typ , Typ.s , Coul.i )
 With *This
  Select UCase( Typ ) 
   Case "H"
    \Couleur_H = Coul
    ;CaseEnd			Utilisé uniquement pour le pliage du code
   Case "M"
    \Couleur_M = Coul
    ;CaseEnd			Utilisé uniquement pour le pliage du code
   Case "S"
    \Couleur_S = Coul
    ;CaseEnd			Utilisé uniquement pour le pliage du code
  EndSelect
 EndWith
EndProcedure
Procedure   Obj_Horloge_SetTime ( *This.Obj_Horloge_Typ , Time.q  )
 Protected .u Heures    , Minutes    , Seconds
 Protected .f AngleHeures , AngleMinutes , AngleSecondes
 
 Heures    = Hour  ( Time ) 
 Minutes    = Minute ( Time ) 
 Seconds    = Second ( Time )
 
 With *This
  ; Si changement de second
  If Seconds <> \OldSec
   ; Calcule l'angle de chacunes des aiguilles
   AngleHeures     = -\Sens * \RadParSeconde_H * ( 3600 * Heures  + 60 * Minutes + Seconds )
   AngleMinutes    = -\Sens * \RadParSeconde_M * ( 60 * Minutes + Seconds )
   AngleSecondes   = -\Sens * \RadParSeconde_S * Seconds 
   Obj_Horloge_CalcPtsAiguille ( *This , AngleHeures , AngleMinutes , AngleSecondes )
   Obj_Horloge_DessineAiguille ( *This )
   ; Rafraichi l'affichage en Plaqant le fichier image dans l'objet ImageGadget
   SetGadgetState ( \GadgetImage , ImageID( \CadranHorloge ) )
   \OldSec = Seconds
  EndIf
 EndWith
EndProcedure
Procedure   Obj_Horloge_SetTexte ( *This.Obj_Horloge_Typ , Dx.w , Dy.w , Txt.s )
 StartDrawing ( ImageOutput( *This\CadranFond ) )
 DrawText( Dx , Dy , Txt , #White , #Black )
 StopDrawing()
EndProcedure

Procedure   Obj_Horloge_Free ( *This.Obj_Horloge_Typ )
 FreeMemory( *This )
EndProcedure

; Procedures d'initialisation de l'objet
Procedure .i Obj_Horloge_Init ( GadImg.i , ColFond.i , SensRot.f=1 )
 Protected *Object.Obj_Horloge_Typ
 
 *Object = AllocateMemory( SizeOf( Obj_Horloge_Typ ) )
 If *Object
  With *Object
   \DSVT              = ?Obj_Horloge_Class
   \DimX              = GadgetWidth  ( GadImg )
   \DimY              = GadgetHeight ( GadImg )
   If \DimX < \DimY : \Diametre = \DimX
   Else             : \Diametre = \DimY
   EndIf
   \Rayon             = Int( \Diametre / 2.0 )
   \RadParSeconde_H   = #PI / 21600.0
   \RadParSeconde_M   = #PI /  1800.0
   \RadParSeconde_S   = #PI /    30.0
   If SensRot > 0   : \Sens =  1
   Else             : \Sens = -1
   EndIf
   
   \Sens                = Sign( SensRot )
   \Couleur_H           = $00ff00 ; ( B, V, R )	Vert
   \Couleur_M           = $ff0000 ; ( B, V, R )	Bleu
   \Couleur_S           = $0000ff ; ( B, V, R )	Rouge
   \CouleurFond         = ColFond
   \CouleurRepereCadran = \CouleurFond ! $FFFFFF
   \NbPointAigui        = 31   ; ( 32 points maxi de 0 a 31 )
   \NbPointAigui_H      = -1
   \NbPointAigui_M      = -1
   \NbPointAigui_S      = -1
   
   \GadgetImage        = GadImg
   \CadranFond         = CreateImage ( #PB_Any   , \DimX , \DimY , 32 , \CouleurFond )
   \CadranHorloge      = CopyImage  ( \CadranFond , #PB_Any )
   \RayonMini          = 0.95 * \Rayon
   \RayonMaxi          = 0.99 * \Rayon
   \RayonUnit          = 0.05 * \Rayon
   \OldSec             = 0
   
   \FillHeure\x        = 0
   \FillHeure\y        = 0
   \FillHeure\Ray      = 0
   \FillHeure\Arg      = 0
   \FillHeure\CoulOn   = #False
   
   \FillMinute\x       = 0
   \FillMinute\y       = 0
   \FillMinute\Ray     = 0
   \FillMinute\Arg     = 0
   \FillMinute\CoulOn  = #False
   
   \FillSeconde\x      = 0
   \FillSeconde\y      = 0
   \FillSeconde\Ray    = 0
   \FillSeconde\Arg    = 0
   \FillSeconde\CoulOn = #False
   
   Dim \AiguilleHeure   .Coordonnee( \NbPointAigui )
   Dim \AiguilleMinute  .Coordonnee( \NbPointAigui )
   Dim \AiguilleSeconde .Coordonnee( \NbPointAigui )
   
   ; Initialise des aiguilles par defaut
   ; Aiguille des heures
   Obj_Horloge_AddPointAiguille( *Object , "H" ,   0 ,  70 ) ; 0
   Obj_Horloge_AddPointAiguille( *Object , "H" ,  10 ,   0 ) ; 1
   Obj_Horloge_AddPointAiguille( *Object , "H" ,   0 , -10 ) ; 2
   Obj_Horloge_AddPointAiguille( *Object , "H" , -10 ,   0 ) ; 3
   Obj_Horloge_AddPointAiguille( *Object , "H" ,   0 ,  70 ) ; 4
   
   ; Aiguille des minutes
   Obj_Horloge_AddPointAiguille( *Object , "M" ,   0 ,  80 ) ; 0
   Obj_Horloge_AddPointAiguille( *Object , "M" ,   5 , - 5 ) ; 1
   Obj_Horloge_AddPointAiguille( *Object , "M" ,   0 , -15 ) ; 2
   Obj_Horloge_AddPointAiguille( *Object , "M" , - 5 , - 5 ) ; 3
   Obj_Horloge_AddPointAiguille( *Object , "M" ,   0 ,  80 ) ; 4
   
   ; Aiguille des secondes
   Obj_Horloge_AddPointAiguille( *Object , "S" ,   0 ,  90 ) ; 0
   Obj_Horloge_AddPointAiguille( *Object , "S" ,   5 ,   0 ) ; 1
   Obj_Horloge_AddPointAiguille( *Object , "S" ,   0 , -30 ) ; 2
   Obj_Horloge_AddPointAiguille( *Object , "S" , - 5 ,   0 ) ; 3
   Obj_Horloge_AddPointAiguille( *Object , "S" ,   0 ,  90 ) ; 4
   
   ; Initialise le cadran
   Protected .w X1 , Y1 , X2 , Y2
   Protected .f ValCos , ValSin
   Protected .i i
   StartDrawing ( ImageOutput( \CadranFond ) )  ; Demarre la procedure de tracé dans le fichier image
   SetOrigin   ( \DimX / 2 , \DimY / 2 )     ; Place l'origine du tracé
   
   ; Dessine les repère sur le cadran
   FrontColor( \CouleurRepereCadran )
   
   For i = 0 To 59 
    ValCos = Cos( i * \RadParSeconde_S )
    ValSin = Sin( i * \RadParSeconde_S )
    
    ; Les repaires 1 minutes
    X1   = \RayonMini
    Y1   = \RayonMini
    
    ; Les repaires  5 minutes
    If i %  5 = 0 : X1 - \RayonUnit : Y1 - \RayonUnit : EndIf
    
    ; Les repaires 15 minutes
    If i % 15 = 0 : X1 - \RayonUnit : Y1 - \RayonUnit : EndIf
    
    ; Calcule les coordonnées du point 1
    X1   = X1 * ValCos
    Y1   = Y1 * ValSin
    
    ; Calcule les coordonnées du point 2
    X2   = \RayonMaxi * ValCos
    Y2   = \RayonMaxi * ValSin
    ; Trace les repaires sur le cadran
    LineXY( X1 , -Y1 , X2 , -Y2 )
   Next
   Circle ( 0, 0, 2 )            ; Trace L'axe des aiguilles sur le cadran
   StopDrawing( )              ; Termine la procedure de tracé dans le fichier image
   
  EndWith
 EndIf
 ProcedureReturn *object
EndProcedure

DataSection
 Obj_Horloge_Class:
 Data.i @Obj_Horloge_NewAiguille      ( )
 Data.i @Obj_Horloge_AddPointAiguille ( )
 Data.i @Obj_Horloge_SetFill          ( )
 Data.i @Obj_Horloge_SetColor         ( )
 Data.i @Obj_Horloge_SetTime          ( )
 Data.i @Obj_Horloge_SetTexte         ( )
 Data.i @Obj_Horloge_Free             ( )
EndDataSection



; *******************
; *** Utilisation ***
; *******************
; 
; MonHorloge	.NewObj_Horloge	= Obj_Horloge_Init	( GadImg.i	, ColFond.i	, SensRot.f=1 )
;	MonHorloge\NewAiguille				( Typ.s		)
;	MonHorloge\AddPointAiguille		( Typ.s	, Dx.w	, Dy.w	)		; 32 points maxi
;	MonHorloge\SetFill						( Typ.s	, Dx.w	, Dy.w )
;	MonHorloge\SetTime						(	Time.q	)
;	MonHorloge\SetColor						( Typ.s		, Coul.i	)
;	MonHorloge\SetTexte						( Dx.w	, Dy.w	, Txt.s	)
;	MonHorloge\Free								(	)


Le code principal : "Horloge Principal.pb"

Code : Tout sélectionner


; PureBasic version 6.12
;
; Liste des fichier utilisés
; Ce fichier
; "Obj Horloge.pb"
; "Horloge Form.pbf"
;
; 7 horloges affiché dans une fenêtre
; Forme		des aiguilles personnalisables
; Couleur	des aiguilles personnalisables
; aiguilles pleines ou creuses
; Sens de rotation des aiguilles inversable
; Ajout possible de textes sur l'horloge
; Ajout possible de décalage horaire pour chacune des horloges


XIncludeFile "Obj Horloge.pb"
; Les commandes de l'objet :
; MonHorloge	.NewObj_Horloge	= Obj_Horloge_Init	( GadImg.i	, ColFond.i	, SensRot.f=1 )
;	MonHorloge\NewAiguille				( Typ.s		)
;	MonHorloge\AddPointAiguille		( Typ.s	, Dx.w	, Dy.w	)		; 32 points maxi
;	MonHorloge\SetFill						( Typ.s	, Dx.w	, Dy.w )
;	MonHorloge\SetTime						(	Time.q	)
;	MonHorloge\SetColor						( Typ.s		, Coul.i	)
;	MonHorloge\SetTexte						( Dx.w	, Dy.w	, Txt.s	)
;	MonHorloge\Free								(	)

XIncludeFile "Horloge Form.pbf"
OpenWindow_0( )



; ***********************
; *     Horloge N°1     *
; *                     *
CouleurDuFond  .i = #Black
SensDeRotation .b = -1  ; Sens inverse
Global MonHorloge1 .NewObj_Horloge = Obj_Horloge_Init ( #ImageGadget_1 , CouleurDuFond , SensDeRotation )
MonHorloge1\SetTexte         (  5 , 5 , "N°1" )
MonHorloge1\SetTexte         ( 160 , 5 , "PB 6.12" )
; une seule coordonnée dessinera un cercle vide ou plein
; Aiguille des heures
MonHorloge1\NewAiguille      ( "H" )           ; Remise à 0 de l' aiguilles des Heures
MonHorloge1\AddPointAiguille ( "H" , 0 , 70 )  ; Place un point au coordonnées x et y
MonHorloge1\SetFill          ( "H" , 0 , 70 )  ; Active le remplissage à cette coordonnée

; Aiguille des minutes
MonHorloge1\NewAiguille      ( "M" )           ; Remise à 0 de l' aiguilles des Minutes
MonHorloge1\AddPointAiguille ( "M" , 0 , 80 )
;MonHorloge1\SetFill         ( "M" , 0 , 80 )  ; Si non défini alors le remplissage n'est pas activé

; Aiguille des secondes
MonHorloge1\NewAiguille      ( "S" )           ; Remise à 0 de l' aiguilles des Secondes
MonHorloge1\AddPointAiguille ( "S" , 0 , 90 )
;MonHorloge1\SetFill         ( "S" , 0 , 90 )

; ***********************
; *     Horloge N°2     *
; *                     *
CouleurDuFond  .i = $000080
SensDeRotation .b = 1  ; Sens normal
Global MonHorloge2 .NewObj_Horloge = Obj_Horloge_Init ( #ImageGadget_2 , CouleurDuFond , SensDeRotation )
MonHorloge2\SetTexte         ( 5 , 5 , "N°2" )
MonHorloge2\NewAiguille      ( "" )               ; Remise à 0 de toutes les aiguilles
; Aiguille des heures
MonHorloge2\AddPointAiguille ( "H" ,   0 ,  70 )  ; Point 1
MonHorloge2\AddPointAiguille ( "H" ,   0 , -10 )  ; Point 2
; Aiguille des minutes
MonHorloge2\AddPointAiguille ( "M" ,   0 ,  80 )  ; Point 1
MonHorloge2\AddPointAiguille ( "M" ,   0 , -20 )  ; Point 2
; Aiguille des secondes
MonHorloge2\AddPointAiguille ( "S" ,   0 ,  90 )  ; Point 1
MonHorloge2\AddPointAiguille ( "S" ,   0 , -30 )  ; Point 2

; ***********************
; *     Horloge N°3     *
; *                     *
CouleurDuFond  .i = RGB( $00 , $80 , $00 )
SensDeRotation .b = 1
Global MonHorloge3 .NewObj_Horloge = Obj_Horloge_Init ( #ImageGadget_3 , CouleurDuFond , SensDeRotation )
MonHorloge3\SetTexte         ( 5 , 5 , "N°3" )
MonHorloge3\NewAiguille      ( "" )               ; Remise à 0 de toutes les aiguilles
; Aiguille des heures
MonHorloge3\AddPointAiguille ( "H" , -15 , -10 )  ; Point 1
MonHorloge3\AddPointAiguille ( "H" ,   0 ,  70 )  ; Point 2
MonHorloge3\AddPointAiguille ( "H" ,  15 , -10 )  ; Point 3
; Aiguille des minutes
MonHorloge3\AddPointAiguille ( "M" , -10 , -20 )  ; Point 1
MonHorloge3\AddPointAiguille ( "M" ,   0 ,  80 )  ; Point 2
MonHorloge3\AddPointAiguille ( "M" ,  10 , -20 )  ; Point 3
; Aiguille des secondes
MonHorloge3\AddPointAiguille ( "S" , - 5 , -30 )  ; Point 1
MonHorloge3\AddPointAiguille ( "S" ,   0 ,  90 )  ; Point 2
MonHorloge3\AddPointAiguille ( "S" ,   5 , -30 )  ; Point 3

; ***********************
; *     Horloge N°4     *
; *                     *
CouleurDuFond  .i = $800000
SensDeRotation .b = 1
Global MonHorloge4 .NewObj_Horloge = Obj_Horloge_Init ( #ImageGadget_4 , CouleurDuFond , SensDeRotation )
MonHorloge4\SetTexte         ( 5 , 5 , "N°4" )
MonHorloge4\NewAiguille      ( "" )               ; Remise à 0 de toutes les aiguilles
; Aiguille des heures
MonHorloge4\AddPointAiguille ( "H" , -15 , -10 )  ; Point 1
MonHorloge4\AddPointAiguille ( "H" ,   0 ,  70 )  ; Point 2
MonHorloge4\AddPointAiguille ( "H" ,  15 , -10 )  ; Point 3
MonHorloge4\AddPointAiguille ( "H" , -15 , -10 )  ; Point 4
MonHorloge4\SetColor         ( "H" , $FFFF00   )  ; Redéfinition de la couleur de l'aiguille
MonHorloge4\SetFill          ( "H" ,   0 ,   0 )  ; Active le remplissage à cette coordonnée
; Aiguille des minutes
MonHorloge4\AddPointAiguille ( "M" , -10 , -20 )  ; Point 1
MonHorloge4\AddPointAiguille ( "M" ,   0 ,  80 )  ; Point 2
MonHorloge4\AddPointAiguille ( "M" ,  10 , -20 )  ; Point 3
MonHorloge4\AddPointAiguille ( "M" , -10 , -20 )  ; Point 4
MonHorloge4\SetColor         ( "m" , $FF00FF   )  ; Redéfinition de la couleur de l'aiguille
MonHorloge4\SetFill          ( "M" ,   0 ,   0 )  ; Active le remplissage à cette coordonnée
; Aiguille des secondes
MonHorloge4\AddPointAiguille ( "S" , - 5 , -30 )  ; Point 1
MonHorloge4\AddPointAiguille ( "S" ,   0 ,  90 )  ; Point 2
MonHorloge4\AddPointAiguille ( "S" ,   5 , -30 )  ; Point 3
MonHorloge4\AddPointAiguille ( "S" , - 5 , -30 )  ; Point 4
MonHorloge4\SetColor         ( "s" , $00FFFF   )  ; Redéfinition de la couleur de l'aiguille
MonHorloge4\SetFill          ( "S" ,   0 ,   0 )  ; Active le remplissage à cette coordonnée

; ***********************
; *     Horloge N°5     *
; *                     *
CouleurDuFond  .i = $008080
SensDeRotation .b = 1
Global MonHorloge5 .NewObj_Horloge = Obj_Horloge_Init ( #ImageGadget_5 , CouleurDuFond , SensDeRotation )
MonHorloge5\SetTexte       ( 5 , 5 , "N°5" )
MonHorloge5\NewAiguille    ( "" )        ; Remise à 0 de toutes les aiguilles
; Aiguille des heures
MonHorloge5\AddPointAiguille ( "H" ,   0 ,  70 )  ; Point 1
MonHorloge5\AddPointAiguille ( "H" ,   5 , -10 )  ; Point 2
MonHorloge5\AddPointAiguille ( "H" ,   0 ,   0 )  ; Point 3
MonHorloge5\AddPointAiguille ( "H" , - 5 , -10 )  ; Point 4
MonHorloge5\AddPointAiguille ( "H" ,   0 ,  70 )  ; Point 5
MonHorloge5\SetFill          ( "H" ,   0 ,   5 )  ; Active le remplissage à cette coordonnée
; Aiguille des minutes
MonHorloge5\AddPointAiguille ( "M" ,   0 ,  80 )  ; Point 1
MonHorloge5\AddPointAiguille ( "M" ,   5 , -20 )  ; Point 2
MonHorloge5\AddPointAiguille ( "M" ,   0 ,   0 )  ; Point 3
MonHorloge5\AddPointAiguille ( "M" , - 5 , -20 )  ; Point 4
MonHorloge5\AddPointAiguille ( "M" ,   0 ,  80 )  ; Point 5
MonHorloge5\SetFill          ( "M" ,   0 ,   5 )  ; Active le remplissage à cette coordonnée
; Aiguille des secondes
MonHorloge5\AddPointAiguille ( "S" ,   0 ,  90 )  ; Point 1
MonHorloge5\AddPointAiguille ( "S" ,   5 , -30 )  ; Point 2
MonHorloge5\AddPointAiguille ( "S" ,   0 ,   0 )  ; Point 3
MonHorloge5\AddPointAiguille ( "S" , - 5 , -30 )  ; Point 4
MonHorloge5\AddPointAiguille ( "S" ,   0 ,  90 )  ; Point 5
MonHorloge5\SetFill          ( "S" ,   0 ,   5 )  ; Active le remplissage à cette coordonnée

; ***********************
; *     Horloge N°6     *
; *                     *
CouleurDuFond  .i = $800080
SensDeRotation .b = -1
Global MonHorloge6 .NewObj_Horloge = Obj_Horloge_Init ( #ImageGadget_6 , CouleurDuFond , SensDeRotation )
MonHorloge6\SetTexte         ( 5 , 5 , "N°6" )
MonHorloge6\NewAiguille      ( "" )               ; Remise à 0 de toutes les aiguilles
; Aiguille des heures
MonHorloge6\AddPointAiguille ( "H" , -10 , -10 )  ; Point 1
MonHorloge6\AddPointAiguille ( "H" , -10 ,  60 )  ; Point 2
MonHorloge6\AddPointAiguille ( "H" ,   0 ,  70 )  ; Point 3
MonHorloge6\AddPointAiguille ( "H" ,  10 ,  60 )  ; Point 4
MonHorloge6\AddPointAiguille ( "H" ,  10 , -10 )  ; Point 5
MonHorloge6\AddPointAiguille ( "H" , -06 , -10 )  ; Point 6
MonHorloge6\AddPointAiguille ( "H" , -06 ,  58 )  ; Point 7
MonHorloge6\AddPointAiguille ( "H" ,   0 ,  64 )  ; Point 8
MonHorloge6\AddPointAiguille ( "H" ,   6 ,  58 )  ; Point 9
MonHorloge6\AddPointAiguille ( "H" ,   6 , - 6 )  ; Point 10
; Aiguille des minutes
MonHorloge6\AddPointAiguille ( "M" , -10 , -10 )  ; Point 1
MonHorloge6\AddPointAiguille ( "M" , -10 ,  70 )  ; Point 2
MonHorloge6\AddPointAiguille ( "M" ,   0 ,  80 )  ; Point 3
MonHorloge6\AddPointAiguille ( "M" ,  10 ,  70 )  ; Point 4
MonHorloge6\AddPointAiguille ( "M" ,  10 , -10 )  ; Point 5
MonHorloge6\AddPointAiguille ( "M" , - 6 , -10 )  ; Point 6
MonHorloge6\AddPointAiguille ( "M" , - 6 ,  68 )  ; Point 7
MonHorloge6\AddPointAiguille ( "M" ,   0 ,  74 )  ; Point 8
MonHorloge6\AddPointAiguille ( "M" ,   6 ,  68 )  ; Point 9
MonHorloge6\AddPointAiguille ( "M" ,   6 , - 6 )  ; Point 10
; Aiguille des secondes
MonHorloge6\AddPointAiguille ( "S" , -10 , -10 )  ; Point 1
MonHorloge6\AddPointAiguille ( "S" , -10 ,  80 )  ; Point 2
MonHorloge6\AddPointAiguille ( "S" ,   0 ,  90 )  ; Point 3
MonHorloge6\AddPointAiguille ( "S" ,  10 ,  80 )  ; Point 4
MonHorloge6\AddPointAiguille ( "S" ,  10 , -10 )  ; Point 5
MonHorloge6\AddPointAiguille ( "S" , - 6 , -10 )  ; Point 6
MonHorloge6\AddPointAiguille ( "S" , -06 ,  78 )  ; Point 7
MonHorloge6\AddPointAiguille ( "S" ,   0 ,  84 )  ; Point 8
MonHorloge6\AddPointAiguille ( "S" ,   6 ,  78 )  ; Point 9
MonHorloge6\AddPointAiguille ( "S" ,   6 , - 6 )  ; Point 10

; ***********************
; *     Horloge N°7     *
; *                     *
CouleurDuFond  .i = #White
SensDeRotation .b = -1
Global MonHorloge7 .NewObj_Horloge = Obj_Horloge_Init ( #ImageGadget_7 , CouleurDuFond , SensDeRotation )
MonHorloge7\SetTexte         ( 5 , 5 , "N°7" )
MonHorloge7\NewAiguille      ( "" )               ; Remise à 0 de toutes les aiguilles
; Aiguille des heures
MonHorloge7\AddPointAiguille ( "H" ,   0 , -10 )  ; Point 1
MonHorloge7\AddPointAiguille ( "H" , -15 , -10 )  ; Point 2
MonHorloge7\AddPointAiguille ( "H" ,   0 ,  70 )  ; Point 3
MonHorloge7\AddPointAiguille ( "H" ,  15 , -10 )  ; Point 4
MonHorloge7\AddPointAiguille ( "H" ,   0 , -10 )  ; Point 5
MonHorloge7\AddPointAiguille ( "H" ,   0 , - 5 )  ; Point 6
MonHorloge7\AddPointAiguille ( "H" , -10 , - 5 )  ; Point 7
MonHorloge7\AddPointAiguille ( "H" ,   0 ,  50 )  ; Point 8
MonHorloge7\AddPointAiguille ( "H" ,  10 , - 5 )  ; Point 9
MonHorloge7\AddPointAiguille ( "H" ,   0 , - 5 )  ; Point 10
MonHorloge7\SetColor         ( "H" , $000080  )   ; Redéfinition de la couleur de l'aiguille
MonHorloge7\SetFill          ( "H" ,   5 , - 7 )  ; Active le remplissage à cette coordonnée
; Aiguille des minutes
MonHorloge7\AddPointAiguille ( "M" ,   0 , -15 )  ; Point 1
MonHorloge7\AddPointAiguille ( "M" , -15 , -15 )  ; Point 2
MonHorloge7\AddPointAiguille ( "M" ,   0 ,  80 )  ; Point 3
MonHorloge7\AddPointAiguille ( "M" ,  15 , -15 )  ; Point 4
MonHorloge7\AddPointAiguille ( "M" ,   0 , -15 )  ; Point 5
MonHorloge7\AddPointAiguille ( "M" ,   0 , -10 )  ; Point 6
MonHorloge7\AddPointAiguille ( "M" , -10 , -10 )  ; Point 7
MonHorloge7\AddPointAiguille ( "M" ,   0 ,  60 )  ; Point 8
MonHorloge7\AddPointAiguille ( "M" ,  10 , -10 )  ; Point 9
MonHorloge7\AddPointAiguille ( "M" ,   0 , -10 )  ; Point 10
MonHorloge7\SetColor         ( "M" , $008000   )  ; Redéfinition de la couleur de l'aiguille
MonHorloge7\SetFill          ( "M" ,   5 , -12 )  ; Active le remplissage à cette coordonnée
; Aiguille des secondes
MonHorloge7\AddPointAiguille ( "S" ,   0 , -20 )  ; Point 1
MonHorloge7\AddPointAiguille ( "S" , -15 , -20 )  ; Point 2
MonHorloge7\AddPointAiguille ( "S" ,   0 ,  90 )  ; Point 3
MonHorloge7\AddPointAiguille ( "S" ,  15 , -20 )  ; Point 4
MonHorloge7\AddPointAiguille ( "S" ,   0 , -20 )  ; Point 5
MonHorloge7\AddPointAiguille ( "S" ,   0 , -15 )  ; Point 6
MonHorloge7\AddPointAiguille ( "S" , -10 , -15 )  ; Point 7
MonHorloge7\AddPointAiguille ( "S" ,   0 ,  70 )  ; Point 8
MonHorloge7\AddPointAiguille ( "S" ,  10 , -15 )  ; Point 9
MonHorloge7\AddPointAiguille ( "S" ,   0 , -15 )  ; Point 10
MonHorloge7\SetColor         ( "s" , $800000   )  ; Redéfinition de la couleur de l'aiguille
MonHorloge7\SetFill          ( "S" ,   5 , -17 )  ; Active le remplissage à cette coordonnée


#PL_Timer_1  = 1
AddWindowTimer  ( #Window_0 , #PL_Timer_1 , 100 )

;*********************
;* Boucle principale *
;*********************
;- Boucle de gestion des evenements
Repeat
 ; On attend qu'un évènement se produise
 Evenement = WaitWindowEvent( )
 ; Si le Timer " #PL_Timer_1 " a cree l'évènement alors ont met l'horloge a jour
 If Evenement = #PB_Event_Timer And EventTimer( ) = #PL_Timer_1
  ; Ajout d'un décalage horaire aux horloges
  Date1.q   = Date  ( )                 ; Date du jour
  Date1    = AddDate ( Date1 ,#PB_Date_Hour   ,   2 )  ; Date du jour + 2 heures
  Date1    = AddDate ( Date1 ,#PB_Date_Minute , -15 )  ; Date du jour - 15 Minutes
  Date1    = AddDate ( Date1 ,#PB_Date_Second , -45 )  ; Date du jour - 45 secondes
  MonHorloge1\SetTime  ( Date1)              ; Mise à jour de l'horloge 1
  
  Date1.q   = Date  ( )
  Date1    = AddDate ( Date1 ,#PB_Date_Hour   ,   4 )
  Date1    = AddDate ( Date1 ,#PB_Date_Minute , -30 )
  Date1    = AddDate ( Date1 ,#PB_Date_Second , -30 )
  MonHorloge2\SetTime  ( Date1 )              ; Mise à jour de l'horloge 2
  
  Date1.q   = Date  ( )
  Date1    = AddDate ( Date1 ,#PB_Date_Hour   ,   6 )
  Date1    = AddDate ( Date1 ,#PB_Date_Minute , -45 )
  Date1    = AddDate ( Date1 ,#PB_Date_Second , -15 )
  MonHorloge3\SetTime  ( Date1 )              ; Mise à jour de l'horloge 3
  
  Date1.q   = Date  ( )
  Date1    = AddDate ( Date1 ,#PB_Date_Hour   , - 6 )
  Date1    = AddDate ( Date1 ,#PB_Date_Minute ,  45 )
  Date1    = AddDate ( Date1 ,#PB_Date_Second ,  15 )
  MonHorloge4\SetTime  ( Date1 )              ; Mise à jour de l'horloge 4
  
  Date1.q   = Date  ( )
  Date1    = AddDate ( Date1 ,#PB_Date_Hour   , - 2 )
  Date1    = AddDate ( Date1 ,#PB_Date_Minute ,  15 )
  Date1    = AddDate ( Date1 ,#PB_Date_Second ,  45 )
  MonHorloge5\SetTime  ( Date1 )              ; Mise à jour de l'horloge 5
  
  Date1.q   = Date  ( )
  Date1    = AddDate ( Date1 ,#PB_Date_Hour   , - 4 )
  Date1    = AddDate ( Date1 ,#PB_Date_Minute ,  30 )
  Date1    = AddDate ( Date1 ,#PB_Date_Second ,  30 )
  MonHorloge6\SetTime  ( Date1 )              ; Mise à jour de l'horloge 6
  
  ; Date et heure courante du système
  Date1.q   = Date     ( )
  MonHorloge7\SetTime  ( Date1 )              ; Mise à jour de l'horloge 7
 EndIf   
 
Until Evenement = #PB_Event_CloseWindow ; Ferme la fenêtres en quittant

Le formulaire : "Horloge Form.pbf"

Code : Tout sélectionner

;
; This code is automatically generated by the Form Designer.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures need to be put in another source file.
;

Enumeration FormWindow
  #Window_0
EndEnumeration

Enumeration FormGadget
  #ImageGadget_1
  #ImageGadget_3
  #ImageGadget_7
  #ImageGadget_4
  #ImageGadget_5
  #ImageGadget_6
  #ImageGadget_2
EndEnumeration


Procedure OpenWindow_0(x = 0, y = 0, width = 728, height = 440)
  OpenWindow(#Window_0, x, y, width, height, "Horloge", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ImageGadget(#ImageGadget_1, 10, 10, 214, 134, 0, #PB_Image_Border)
  ImageGadget(#ImageGadget_3, 8, 152, 216, 112, 0, #PB_Image_Border)
  ImageGadget(#ImageGadget_7, 232, 8, 260, 256, 0, #PB_Image_Border)
  ImageGadget(#ImageGadget_4, 8, 272, 484, 161, 0, #PB_Image_Border)
  ImageGadget(#ImageGadget_5, 504, 8, 212, 137, 0, #PB_Image_Border)
  ImageGadget(#ImageGadget_6, 504, 152, 212, 137, 0, #PB_Image_Border)
  ImageGadget(#ImageGadget_2, 504, 296, 212, 137, 0, #PB_Image_Border)
EndProcedure

Dernière modification par plabouro472 le dim. 01/déc./2024 13:03, modifié 1 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Horloge analogique paramètrable

Message par Kwai chang caine »

Joli travail, merci pour le partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre