Re: [Résolu] Tracer les chiffres d'une horloge 24 heures
Publié : jeu. 28/nov./2013 14:09
@Dobro : Le code de traçage d'un cercle donnant bien un cercle je ne comprenais pas trop ton histoire d'horloge ronde. Merci pour cet update Dobro 

Forums PureBasic - Français
http://forums.purebasic.com/french/
Non, il faut que ça se rapproche le plus possible d'une horloge analogique, normalement on devrait deviner l'heure juste à la position de la petite aiguille !kernadec a écrit :bonjour
D' abord Merci pour le partage!![]()
Peut être une option pour cette horloge car on pourrait avoir une lecture plus simple
en se disant que pour heure qui est en cours l'aiguille des heures devrait rester sur le chiffe de l'heure
exemple: pour 11h59 l'aiguille devrait être sur le 11 et passerai sur le 12 en même temps que les aiguilles des minutes et des secondes arrive sur le 60
qu'en pensez vous
Cordialement
Code : Tout sélectionner
;##################
;# Horloge murale #
;##################
Enumeration Font
#FontHour
#FontMinute
EndEnumeration
Enumeration Fenetre
#Fenetre_principale
EndEnumeration
Enumeration Sprites
#Trotteuse
#GrandeAiguille
#PetiteAiguille
#Fond
EndEnumeration
Global TailleImage = 720 ; Toujours carrée et en pixels
Global XC.i, YC.i, Radius.i ;Coordonnées et rayon du point central du cercle
Global X.f, Y.f ;Coordonnées des points sur le cercle
Global Digit.i
Global Buffer.s
Global Pos_wx,Pos_wy
; Ajout Ar-S
Global Path$ = GetCurrentDirectory()+"Horloge.ini"
Global.b Quite = 0
Global Couleur=RGB(0,0,0)
If InitSprite()
Else
End
EndIf
Declare MyWindowCallback(WindowID, Message, wParam, lParam)
Declare Forme(fenetre,forme)
; Ajout Ar-S
If FileSize(Path$) < 1
StyleWin = #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered
Else
StyleWin = #PB_Window_MinimizeGadget
EndIf
If OpenFile(1,Path$)
Pos_wx=Val(ReadString(1))
Pos_wy=Val(ReadString(1))
CloseFile(1)
Debug "Open File"
Debug Pos_wx
Debug Pos_wy
EndIf
If OpenWindow(#Fenetre_principale, Pos_wx, Pos_wy, TailleImage, TailleImage, "Horloge murale", StyleWin)
If OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, TailleImage, TailleImage, 1, 0, 0)
CreateSprite(#Trotteuse, 800, 800)
CreateSprite(#GrandeAiguille, 800, 800)
CreateSprite(#PetiteAiguille, 800, 800)
CreateSprite(#Fond, 800, 800)
LoadFont(#FontHour, "Arial", 24, #PB_Font_Bold)
LoadFont(#FontMinute, "Arial", 15)
If StartDrawing(SpriteOutput(#Fond)) ;- fond
;Coordonnées du point central du cercle
XC = 400
YC = 400
;Point central
Circle(XC, YC, 2, RGB(255, 69, 0))
;Les points des heures
Radius = 220
For N = 0 To 345 Step 15
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
Circle(X,Y,3, RGB(255, 69, 0))
Next
;Les points des minutes
Radius = 360
For N = 0 To 364 Step 6
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
Circle(X,Y,3, RGB(128, 128, 128))
Next
;Les Chiffres des heures
Digit=5
Radius = 260
DrawingFont(FontID(#FontHour))
For N = 0 To 345 Step 15
Digit+1
If Digit>23
Digit = 0
EndIf
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
Buffer=Str(Digit)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(X-TextWidth(Buffer)/2, Y-TextHeight(Buffer)/2, Buffer, RGB(255, 255, 255))
DrawingMode(#PB_2DDrawing_Default)
Next
;Les Chiffres des minutes
Digit=15
Radius = 380
DrawingFont(FontID(#FontMinute))
For N = 1 To 359 Step 6
Digit+1
If Digit>60
Digit = 1
EndIf
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
Buffer=Str(Digit-1)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(X-TextWidth(Buffer)/2, Y-TextHeight(Buffer)/2, Buffer, RGB(255, 255, 255))
DrawingMode(#PB_2DDrawing_Default)
Next
StopDrawing()
EndIf
If StartDrawing(SpriteOutput(#Trotteuse))
LineXY(398, 550, 398, 65, RGB(200, 35, 35))
LineXY(399, 550, 399, 60, RGB(200, 35, 35))
LineXY(400, 550, 400, 55, RGB(200, 35, 35))
LineXY(401, 550, 401, 60, RGB(200, 35, 35))
LineXY(402, 550, 402, 65, RGB(200, 35, 35))
Circle(400, 530, 10, RGB(200, 35, 35))
Circle(400, 535, 9, RGB(200, 35, 35))
Circle(400, 540, 8, RGB(200, 35, 35))
Circle(400, 545, 7, RGB(200, 35, 35))
Circle(400, 550, 6, RGB(200, 35, 35))
Circle(400, 400, 15, RGB(200, 35, 35))
StopDrawing()
EndIf
If StartDrawing(SpriteOutput(#GrandeAiguille))
LineXY(390, 400, 380, 180, RGB(255, 255, 255))
LineXY(380, 180, 390, 170, RGB(255, 255, 255))
LineXY(390, 170, 390, 50, RGB(255, 255, 255))
LineXY(390, 50, 400, 42, RGB(255, 255, 255))
LineXY(400, 42, 410, 50, RGB(255, 255, 255))
LineXY(410, 50, 410, 170, RGB(255, 255, 255))
LineXY(410, 170, 420, 180, RGB(255, 255, 255))
LineXY(420, 180, 410, 400, RGB(255, 255, 255))
LineXY(410, 400, 390, 400, RGB(255, 255, 255))
FillArea(400, 300, RGB(255, 255, 255), RGB(255, 255, 255))
Circle(400, 400, 30, RGB(200, 35, 35))
StopDrawing()
EndIf
If StartDrawing(SpriteOutput(#PetiteAiguille))
LineXY(390, 400, 375, 280, RGB(255, 255, 255))
LineXY(375, 280, 390, 260, RGB(255, 255, 255))
LineXY(390, 260, 390, 210, RGB(255, 255, 255))
LineXY(390, 210, 400, 195, RGB(255, 255, 255))
LineXY(400, 195, 410, 210, RGB(255, 255, 255))
LineXY(410, 210, 410, 260, RGB(255, 255, 255))
LineXY(410, 260, 425, 280, RGB(255, 255, 255))
LineXY(425, 280, 410, 400, RGB(255, 255, 255))
LineXY(410, 400, 390, 400, RGB(255, 255, 255))
FillArea(400, 300, RGB(255, 255, 255), RGB(255, 255, 255))
StopDrawing()
EndIf
EndIf
EndIf
SetWindowCallback(@MyWindowCallback())
Forme (#Fenetre_principale,2); ronde
Repeat
Evenement = WaitWindowEvent(2)
xsec.s = FormatDate("%ss", Date())
xmin.s = FormatDate("%ii", Date())
xheure.s = FormatDate("%hh", Date())
If Val(xheure) > 11
xheure = Str(Val(xheure)-12)
EndIf
s = Val(xsec) * 6
m = (Val(xmin) * 60 + Val(xsec)) / 10
h = (Val(xheure) * 60 + Val(xmin)) / 4 ; système 24 h
;h = (Val(xheure) * 60 + Val(xmin)) / 2 ; système 12 h
ZoomSprite(#Trotteuse, TailleImage, TailleImage)
ZoomSprite(#GrandeAiguille, TailleImage, TailleImage)
ZoomSprite(#PetiteAiguille, TailleImage, TailleImage)
ZoomSprite(#Fond, TailleImage, TailleImage)
RotateSprite(#Trotteuse, s, 0)
RotateSprite(#GrandeAiguille, m, 0)
RotateSprite(#PetiteAiguille, h, 0)
DisplayTransparentSprite(#Fond, 0, 0, 255)
DisplayTransparentSprite(#PetiteAiguille, 0, 0, 255)
DisplayTransparentSprite(#GrandeAiguille, 0, 0, 255)
DisplayTransparentSprite(#Trotteuse, 0, 0, 255)
FlipBuffers()
ClearScreen(couleur)
;Delay(20)
Until Evenement = #PB_Event_CloseWindow Or Quite = 1
Pos_wx = WindowX(#Fenetre_principale)
Pos_wy = WindowY(#Fenetre_principale)
OpenFile(1,Path$)
WriteStringN(1,Str(Pos_wx))
WriteStringN(1,Str(Pos_wy))
CloseFile(1)
Debug Pos_wx
Debug Pos_wy
End
Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
;debug Message
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_LBUTTONDOWN ; Deplace la fenetre si on clicque Dessus
SendMessage_(WindowID(#Fenetre_principale), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
Case #WM_RBUTTONDOWN ; Sauve position et quit avec le bouton droit souris
Quite = 1
EndSelect
ProcedureReturn Result
EndProcedure
Procedure Forme(fenetre,forme)
If forme=2 ; si on a choisi la forme 2 Ronde
Region = CreateEllipticRgn_(4, 31, WindowWidth(fenetre),WindowHeight(fenetre)+25) ; Création de la région pour faire une fenêtre ronde !!!
SetWindowRgn_(WindowID(fenetre), Region, #True) ; On applique la région
DeleteObject_(Region) ; On supprime la région
EndIf
EndProcedure; EPB
Code : Tout sélectionner
;##################
;# Horloge 12 et 24 h #
;##################
Enumeration Font
#FontHour
#FontMinute
EndEnumeration
Enumeration Fenetre
#Fenetre_principale
EndEnumeration
Enumeration Sprites
#Trotteuse
#GrandeAiguille
#PetiteAiguille
#Fond
EndEnumeration
Global TailleImage = 720 ; Toujours carrée et en pixels
Global XC.i, YC.i, Radius.i ;Coordonnées et rayon du point central du cercle
Global X.f, Y.f ;Coordonnées des points sur le cercle
Global Digit.i
Global Buffer.s
Global Pos_wx,Pos_wy
Global.i systeme = 24
Global Path$ = GetCurrentDirectory()+"Horloge.ini"
Global.b Quitter = 0
Global Couleur=RGB(0,0,0)
If InitSprite()
Else
End
EndIf
Declare MyWindowCallback(WindowID, Message, wParam, lParam)
Declare Forme(fenetre,forme)
If FileSize(Path$) < 1
StyleWin = #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered
Else
StyleWin = #PB_Window_MinimizeGadget
EndIf
If OpenFile(1,Path$)
Pos_wx=Val(ReadString(1))
Pos_wy=Val(ReadString(1))
CloseFile(1)
EndIf
If OpenWindow(#Fenetre_principale, Pos_wx, Pos_wy, TailleImage, TailleImage, "Horloge murale", StyleWin)
If OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, TailleImage, TailleImage, 1, 0, 0)
CreateSprite(#Trotteuse, 800, 800)
CreateSprite(#GrandeAiguille, 800, 800)
CreateSprite(#PetiteAiguille, 800, 800)
CreateSprite(#Fond, 800, 800)
LoadFont(#FontHour, "Arial", 24, #PB_Font_Bold)
LoadFont(#FontMinute, "Arial", 15)
If StartDrawing(SpriteOutput(#Fond)) ;- fond
;Coordonnées du point central du cercle
XC = 400
YC = 400
;Point central
Circle(XC, YC, 2, RGB(255, 69, 0))
;Les points des heures
Radius = 220
If systeme = 12
For N = 0 To 359 Step 6
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
If Mod(N,30) = 0
Circle(X,Y,6, RGB(255,69,0))
Else
Circle(X,Y,3, RGB(255, 255, 255))
EndIf
Next
Else
For N = 0 To 359 Step 3
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
If Mod(N,15) = 0
Circle(X,Y,6, RGB(255,69,0))
Else
Circle(X,Y,3, RGB(255, 255, 255))
EndIf
Next
EndIf
;Les points des minutes
Radius = 360
For N = 0 To 364 Step 6
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
Circle(X,Y,3, RGB(128, 128, 128))
Next
;Les Chiffres des heures
If systeme = 12
Digit=2
Rayon = 260
DrawingFont(FontID(#FontHour))
For N = 0 To 345 Step 30
Digit+1
If Digit>12
Digit = Mod(12,4) + 1
EndIf
X = XC + Rayon * Cos(N * #PI / 180)
Y = YC + Rayon * Sin(N * #PI / 180)
Buffer=Str(Digit)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(X-TextWidth(Buffer)/2, Y-TextHeight(Buffer)/2, Buffer, RGB(255, 255, 255))
DrawingMode(#PB_2DDrawing_Default)
Next
Else
Digit=5
Radius = 260
DrawingFont(FontID(#FontHour))
For N = 0 To 345 Step 15
Digit+1
If Digit>23
Digit = 0
EndIf
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
Buffer=Str(Digit)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(X-TextWidth(Buffer)/2, Y-TextHeight(Buffer)/2, Buffer, RGB(255, 255, 255))
DrawingMode(#PB_2DDrawing_Default)
Next
EndIf
;Les Chiffres des minutes
Digit=15
Radius = 380
DrawingFont(FontID(#FontMinute))
For N = 1 To 359 Step 6
Digit+1
If Digit>60
Digit = 1
EndIf
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
Buffer=Str(Digit-1)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(X-TextWidth(Buffer)/2, Y-TextHeight(Buffer)/2, Buffer, RGB(255, 255, 255))
DrawingMode(#PB_2DDrawing_Default)
Next
StopDrawing()
EndIf
If StartDrawing(SpriteOutput(#Trotteuse))
LineXY(398, 550, 398, 65, RGB(200, 35, 35))
LineXY(399, 550, 399, 60, RGB(200, 35, 35))
LineXY(400, 550, 400, 55, RGB(200, 35, 35))
LineXY(401, 550, 401, 60, RGB(200, 35, 35))
LineXY(402, 550, 402, 65, RGB(200, 35, 35))
Circle(400, 530, 10, RGB(200, 35, 35))
Circle(400, 535, 9, RGB(200, 35, 35))
Circle(400, 540, 8, RGB(200, 35, 35))
Circle(400, 545, 7, RGB(200, 35, 35))
Circle(400, 550, 6, RGB(200, 35, 35))
Circle(400, 400, 15, RGB(200, 35, 35))
StopDrawing()
EndIf
If StartDrawing(SpriteOutput(#GrandeAiguille))
LineXY(390, 400, 380, 180, RGB(255, 255, 255))
LineXY(380, 180, 390, 170, RGB(255, 255, 255))
LineXY(390, 170, 390, 50, RGB(255, 255, 255))
LineXY(390, 50, 400, 42, RGB(255, 255, 255))
LineXY(400, 42, 410, 50, RGB(255, 255, 255))
LineXY(410, 50, 410, 170, RGB(255, 255, 255))
LineXY(410, 170, 420, 180, RGB(255, 255, 255))
LineXY(420, 180, 410, 400, RGB(255, 255, 255))
LineXY(410, 400, 390, 400, RGB(255, 255, 255))
FillArea(400, 300, RGB(255, 255, 255), RGB(000, 255, 000))
Circle(400, 400, 30, RGB(200, 35, 35))
StopDrawing()
EndIf
If StartDrawing(SpriteOutput(#PetiteAiguille))
LineXY(390, 400, 375, 280, RGB(255, 255, 255))
LineXY(375, 280, 390, 260, RGB(255, 255, 255))
LineXY(390, 260, 390, 210, RGB(255, 255, 255))
LineXY(390, 210, 400, 195, RGB(255, 255, 255))
LineXY(400, 195, 410, 210, RGB(255, 255, 255))
LineXY(410, 210, 410, 260, RGB(255, 255, 255))
LineXY(410, 260, 425, 280, RGB(255, 255, 255))
LineXY(425, 280, 410, 400, RGB(255, 255, 255))
LineXY(410, 400, 390, 400, RGB(255, 255, 255))
FillArea(400, 300, RGB(255, 255, 255), RGB(255, 255, 000))
StopDrawing()
EndIf
EndIf
EndIf
SetWindowCallback(@MyWindowCallback())
Forme (#Fenetre_principale,2); ronde
Repeat
Evenement = WaitWindowEvent(2)
xsec.s = FormatDate("%ss", Date())
xmin.s = FormatDate("%ii", Date())
xheure.s = FormatDate("%hh", Date())
s = Val(xsec) * 6
m = (Val(xmin) * 60 + Val(xsec)) / 10
If systeme = 12
If Val(xheure) > 11
xheure = Str(Val(xheure)-12)
h = (Val(xheure) * 60 + Val(xmin)) / 2 ; système 12 h
EndIf
Else
h = (Val(xheure) * 60 + Val(xmin)) / 4 ; système 24 h
EndIf
ZoomSprite(#Trotteuse, TailleImage, TailleImage)
ZoomSprite(#GrandeAiguille, TailleImage, TailleImage)
ZoomSprite(#PetiteAiguille, TailleImage, TailleImage)
ZoomSprite(#Fond, TailleImage, TailleImage)
RotateSprite(#Trotteuse, s, 0)
RotateSprite(#GrandeAiguille, m, 0)
RotateSprite(#PetiteAiguille, h, 0)
DisplayTransparentSprite(#Fond, 0, 0, 255)
DisplayTransparentSprite(#PetiteAiguille, 0, 0, 255)
DisplayTransparentSprite(#GrandeAiguille, 0, 0, 255)
DisplayTransparentSprite(#Trotteuse, 0, 0, 255)
FlipBuffers()
ClearScreen(couleur)
Until Evenement = #PB_Event_CloseWindow Or Quitter = 1
End
Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
;debug Message
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_PAINT
ResizeWindow(#Fenetre_principale,Pos_wx, Pos_wy,#PB_Ignore, #PB_Ignore)
; *************************************************************
Case #WM_LBUTTONDOWN ; Deplace la fenetre si on clicque Dessus
SendMessage_(WindowID(#Fenetre_principale), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
Case #WM_RBUTTONDOWN ; Sauve position et quit avec le bouton droit souris
Pos_wx = WindowX(#Fenetre_principale)
Pos_wy = WindowY(#Fenetre_principale)
OpenFile(1,Path$)
WriteStringN(1,Str(Pos_wx))
WriteStringN(1,Str(Pos_wy))
CloseFile(1)
Quitter = 1
End
EndSelect
ProcedureReturn Result
EndProcedure
Procedure Forme(fenetre,forme)
If forme=2 ; si on a choisi la forme 2 Ronde
Region = CreateEllipticRgn_(4, 31, WindowWidth(fenetre),WindowHeight(fenetre)+25) ; Création de la région pour faire une fenêtre ronde !!!
SetWindowRgn_(WindowID(fenetre), Region, #True) ; On applique la région
DeleteObject_(Region) ; On supprime la région
EndIf
EndProcedure
Ar-S a écrit : Vieux con !(j'attendais avec impatience de te la replacer)